where am I going wrong here?
private void lstCars_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
string currCar = (sender as ListBox).SelectedItem as string;
NavigationService.Navigate(new Uri("/ViewCarDetails.xaml?info=" + currCar, UriKind.Relative));
}
here is the page im trying to navigate to
public ViewCarDetails(string registrationNum)
{
//stuff
}
and here is the code that the program jumps to when I get an error (in App.xaml.cs)
private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
{
if (System.Diagnostics.Debugger.IsAttached)
{
// A navigation has failed; break into the debugger
System.Diagnostics.Debugger.Break();
}
}
ive checked the URI but no typos
Thank you
The problem is that your are passing a parameter via NavigationService and ViewCarDetails class constructor is expecting a parameter that you are not passing through.
To solve it you have to create a constructor with no parameters and take the parameter you are passing through navigationservice from NavigatedTo event as follow:
public ViewCarDetails()
{
//stuff
}
and
protected override void OnNavigatedTo(NavigationEventArgs e)
{
string registrationNum = string.Empty;
if (NavigationContext.QueryString.TryGetValue("index", out registrationNum))
{
//do stuff
}
}
Try it out and let us know,
ADDED:
public class ViewCarDetails : PhoneApplicationPage
{
private string registrationNum;
public ViewCarDetails()
{
//stuff
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
registrationNum = string.Empty;
if (NavigationContext.QueryString.TryGetValue("index", out registrationNum))
{
//do stuff
}
}
//other methods and properties
}
regards,
Related
I have 3 buttons on one usercontrol (usercontrol1.xaml) in the Window . Now on-click of button 1 ,I want to switch the view to another usercontrol (usercontrol2.xaml), which again have 3 buttons and so on.
How to implement in MVVM Pattern in WPF?
Be aware that im using caliburn micro for this example
private IEventAggregator _eventAggregator => IoC.Get<IEventAggregator>(key: nameof(EventAggregator));
private IWindowManager _windowManager => IoC.Get<IWindowManager>(key: nameof(WindowManager));
public ShellViewModel(IEventAggregator eventAggregator)
{
_eventAggregator.Subscribe(this);
}
public string _firstName;
// public ShellViewModel page = new ShellViewModel();
public string FirstName
{
get {
return _firstName;
}
set
{
_firstName = value;
NotifyOfPropertyChange(() => FirstName);
}
}
public ICommand ConvertTextCommand
{
get { return new DelegateCommand(ConvertText); }
}
void ConvertText()
{
//string url = "https://www.google.com/";
string url = FirstName;
string result;
using (HttpClient client = new HttpClient())
{
using (HttpResponseMessage response = client.GetAsync(url).Result)
{
using (HttpContent content = response.Content)
{
result = content.ReadAsStringAsync().Result;
}
}
}
//(MainWindow)Application.Current.MainWindow).txtForm1TextBox.Text = "Some text";
//Application.Current.Resources.Add("PageSource", result);
// NavigationService.NavigateToViewModel<SecondViewModel>("Hello");
_windowManager.ShowWindow(new PageSourceViewModel(_eventAggregator), null);
_eventAggregator.PublishOnUIThread(result);
}
You can check caliburn micro and see that you can just create a new view model in a window manager instance
here is also 2 links to 2 tutorials that helped me solve this issue for MVVM
https://www.youtube.com/watch?v=laPFq3Fhs8k
https://www.youtube.com/watch?v=9kGcE9thwNw&list=LLy8ROdSzpPJnikdZQ1XPZkQ&index=30&t=0s
the first tutorial will help you to get a general idea. The second will help you with events and you can look back to my code and see how i handled a new window instance.
You can also call the same view model for a new instance of the same window like you said in the question
You will also need to make a boostrapper class. For my example i did it like this.
public class Bootstrapper : BootstrapperBase
{
private readonly SimpleContainer _container =
new SimpleContainer();
public Bootstrapper()
{
Initialize();
}
protected override void Configure()
{
_container.Instance<IWindowManager>(new WindowManager());
_container.Singleton<IEventAggregator, EventAggregator>();
_container.PerRequest<ShellViewModel>();
}
protected override void OnStartup(object sender, StartupEventArgs e)
{
_container.Instance<SimpleContainer>(_container);
_container.Singleton<IWindowManager, WindowManager>(key: nameof(WindowManager))
.Singleton<IEventAggregator, EventAggregator>(key: nameof(EventAggregator));
DisplayRootViewFor<ShellViewModel>();
}
protected override object GetInstance(Type service, string key)
{
return _container.GetInstance(service, key);
}
protected override IEnumerable<object> GetAllInstances(Type service)
{
return _container.GetAllInstances(service);
}
protected override void BuildUp(object instance)
{
_container.BuildUp(instance);
}
}
I am trying to define some event handlers inside auser class but im not sure how. The MainWindow needs the handler definitions.
public abstract partial class MainWindow: Window {
public User user = new User();
}
public class User {
internal void ExampleMouseEventDown(object sender, MouseEventArgs e) {
// Does stuff;
}
}
Isnt there a way to somehow make this work? Such as:
mainWindow.AddHandleDefinition += ExampleMouseEventDown();
Also tried this:
public partial class MainWindow : Window {
public MainWindow() {
User user = new User(this);
}
}
public class User
{
internal User(MainWindow w)
{
w.AddObserverButton.MouseUp += ExampleMouseEventDown;
}
internal void ExampleMouseEventDown(object sender, MouseEventArgs e)
{
// Does stuff;
}
}
I want to insert html code into existing html code.
But I do not see the result. Here is the code C #:
1) Program.cs
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
wUI.DocumentReady += wUI_DocumentReady;
}
private void Form1_Load(object sender, EventArgs e)
{
// code here ?
}
void wUI_DocumentReady(object sender, DocumentReadyEventArgs e)
{
wUI.LoadHTML("<html><body>sadasdsad</body></html>");
HtmlManager html = HtmlManager.Instance;
string[] placeholders = { "asset://customdatastore/path/to/any", "type-button", "no-action", "Example link" };
html.Add("{3}", placeholders);
html.InnerCode(html.Code, wUI, "body");
wUI.Refresh();
}
}
2) HtmlManager.cs
public sealed class HtmlManager
{
private static readonly Lazy<HtmlManager> InstanceField = new Lazy<HtmlManager>(() => new HtmlManager());
private StringBuilder _stringBuilder = null;
public string Code { get { return _stringBuilder.ToString(); } }
private HtmlManager()
{
if (_stringBuilder != null)
_stringBuilder.Clear();
_stringBuilder = new StringBuilder();
}
public static HtmlManager Instance { get { return InstanceField.Value; } }
public void Add(string row, string[] placeholders = null)
{
if (placeholders != null)
_stringBuilder.AppendLine(string.Format(row, placeholders));
_stringBuilder.AppendLine(row);
}
public void InnerCode(string code, object sender, string afterTag = "html")
{
Awesomium.Windows.Forms.WebControl ui = (Awesomium.Windows.Forms.WebControl)sender;
ui.ExecuteJavascript(string.Format("document.getElementsByTagName({0})[0].innerHTML({1})", afterTag, code));
}
public void Clear()
{
_stringBuilder.Clear();
}
}
The event (DocumentReady) does not happen, I do not believe, maybe I'm wrong somewhere?
UP: I try do it:
private void Form1_Load(object sender, EventArgs e)
{
wUI.LoadHTML("<html><body>sadasdsad</body></html>");
}
void wUI_DocumentReady(object sender, DocumentReadyEventArgs e)
{
HtmlManager html = HtmlManager.Instance;
string[] placeholders = { "asset://customdatastore/path/to/any", "type-button", "no-action", "Example link" };
html.Add("{3}", placeholders);
wUI.ExecuteJavascript("document.getElementsByTagName('body').innerHTML(\"sometext\")");
//html.InnerCode(html.Code, wUI, "body");
//wUI.Refresh();
}
No result
UP 2:
public void Add(string row, string[] placeholders = null)
{
if (placeholders != null)
_stringBuilder.AppendLine(string.Format(row, placeholders));
if (placeholders == null)
_stringBuilder.AppendLine(row);
}
UP 3:
Work with:
wUI.Source = new Uri(#"http://google.com");
in Form1_Load
You can use LoadHtml method, but only after document is fully loaded (don't confuse with DocumentReadyState.Ready) It works for me at least:
private void WebControl_DocumentReady(object sender, DocumentReadyEventArgs e)
{
if (e.ReadyState != DocumentReadyState.Loaded) return;
}
But as an initialisation, you should use Source property, like you wrote in your third update
Hi I have created a sample database application in Silverlight by following a tutorial. I am trying to insert a record in DB but it throws an error Submit operation failed validation. Please inspect Entity.ValidationErrors for each entity in EntitiesInError for more information. I am using Entity framework for DAL. My code is given below. Exception occure when I insert a record. But Iam not sure at which stage exception occurs.
RecordInsertPage.cs file
public partial class BookRegistaeration : ChildWindow
{
public Book newBook { get; set; }
public BookRegistaeration()
{
InitializeComponent();
newBook = new Book();
AddBookForm.CurrentItem =AddBookForm;
AddBookForm.BeginEdit();
}
private void OKButton_Click(object sender, RoutedEventArgs e)
{
AddBookForm.CommitEdit();
this.DialogResult = true;
}
private void CancelButton_Click(object sender, RoutedEventArgs e)
{
newBook = null;
AddBookForm.CancelEdit();
this.DialogResult = false;
}
}
Service.cs Page
public class OrganizationService : LinqToEntitiesDomainService<LibraryEntities1>
{
public IQueryable<Book> GetBooks()
{
return this.ObjectContext.Books.OrderBy(e => e.BookId);
}
public void InsertBook(Book book)
{
//book.Title = "Hello book";
//book.Author = "Ali";
//book.Category = "Humanity";
if ((book.EntityState != EntityState.Detached))
{
this.ObjectContext.ObjectStateManager.ChangeObjectState(book, EntityState.Added);
}
else
{
this.ObjectContext.Books.AddObject(book);
}
}
public void UpdateBook(Book currentBook)
{
this.ObjectContext.Books.AttachAsModified(currentBook, this.ChangeSet.GetOriginal(currentBook));
}
public void DeleteBook(Book book)
{
if ((book.EntityState != EntityState.Detached))
{
this.ObjectContext.ObjectStateManager.ChangeObjectState(book, EntityState.Deleted);
}
else
{
this.ObjectContext.Books.Attach(book);
this.ObjectContext.Books.DeleteObject(book);
}
}
}
private void LibraryDataSource_SubmittedChanges(object sender, SubmittedChangesEventArgs e)
{
if (e.HasError)
{
MessageBox.Show(string.Format("Changes were not saved: {0}", e.Error.Message));
e.MarkErrorAsHandled();
}
submitButton.IsEnabled = true;
}
void addBook_Closed(object sender, EventArgs e)
{
BookRegistaeration book = (BookRegistaeration)sender;
if (book.newBook != null)
{
OrganizationContext _OrganizationContext = (OrganizationContext)(LibraryDataSource.DomainContext);
_OrganizationContext.Books.Add(book.newBook);
LibraryDataSource.SubmitChanges();
}
}
Try doing as the exception message suggests, put a breakpoint on your SubmittedChanges event to inspect that exception object for which you should be able to see Entity.ValidationErrors for each entity in EntitiesInError.
This should tell you which of the fields in the object you are trying to add has failed the validation check, you may have null data in fields which cannot be null. You may find string properties are not allowed to be empty.
Try also to ensure your form is properly populating the object you will be adding, you could place a breakpoint before CommitEdit is called and inspect the object state.
i do not understand this line !
AddBookForm.CurrentItem =AddBookForm;
why did you write this?
it should be something like this
AddBookForm.CurrentItem = your class object !
I am new to WP7 programming and I have been following this tutorial
http://weblogs.asp.net/scottgu/archive/2010/03/18/building-a-windows-phone-7-twitter-application-using-silverlight.aspx
However I have run into a number of errors and I was wondering if anyone could tell me why. I have been over and over the code and as far as I can see it is all correct.
The first issue is a:
No overload for "twitter_DownloadsStringCompleted" matches delegate system.net.downloadStringEventHandler
Here is the code:
private void button2_Click(object sender, RoutedEventArgs e)
{
WebClient twitter = new WebClient();
twitter.DownloadStringCompleted += new DownloadStringCompletedEventHandler(twitter_DownloadStringCompleted);
twitter.DownloadStringAsync(new Uri("http://api.twitter.com/1/statuses/user_timeline.xml?screen_name=" + username.Text));
}
void twitter_DownloadStringCompleted(object sender, DownloadStringCompletedEventHandler e)
{
throw new NotImplementedException();
}
public class TwitterItem
{
public string UserName { get; set; }
public string Message { get; set; }
public string ImageSource { get; set; }
}
void twitter_DownloadStringCompleted(object sender, DownloadStringCompletedEventHandler e)
{
if (e.Error != null)
return;
XElement xmlTweets = XElement.Parse(e.Result);
listBox1.ItemsSource = from tweet in xmlTweets.Descendants("status")
select new TwitterItem
{
ImageSource = tweet.Elemend("user").Element("profile_image_url").Value,
Message = tweet.Element("text").Value,
UserName = tweet.Element("user").Element("SCreen_name").Value
};
}
}
}
The argument list for your completed event handler should be:
void twitter_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
note it's DownloadStringCompletedEventArgs not DownloadStringCompletedEventHandler.
See this image from the tutorial: