Reputation: 93
I have a ViewModel which is bound to my MainWindow. I have a property in my ViewModel I want to bind to a second window which opens after selecting a menu item. Here is the property I have bound to the second window. So far so good
private string _displayPathToLib;
public string DisplayPathToLib
{
get { return _displayPathToLib; }
set
{
_displayPathToLib = value;
OnPropertyChanged("DisplayPathToLib");
}
}
I use a command using the ICommand interface to open the second window. Here is a snippet
public void Execute(object parameter)
{
BrowseDialog winBrowseDialog = new BrowseDialog();
Nullable<bool> BrowseDialogResult = winBrowseDialog.ShowDialog();
The second window opens as it should and allows me to edit the text box that is displayed. I am able to to see the "DisplayPathToLib" property change when I type something in the textbox (by setting the debug break). But upon closing the window the value of "DisplayPathToLib" reverts to NULL. Below is a snippet of the code behind I am using to handle the ok button click
private void okButton_Click(object sender, RoutedEventArgs e)
{
DialogResult = true;
Close();
}
Why does the property keep reverting back to NULL? How do I get the "DisplayPathToLib" to retain its value??? I have tried everything. I also tried maintaining a MVVM pattern but could not get the OK button to work without code-behind. :-(
Upvotes: 1
Views: 139
Reputation: 93
I solved my problem by setting the datacontext of my new window directly to my ViewModel. To ensure your ViewModel's data keeps the bound values from multiple windows set the new instance of your second window (or multiples windows) to your ViewModel like so...
class UserSettingsCommand : ICommand
{
MainVM _data; //MainVm is my ViewModel class
public UserSettingsCommand(MainVM data)
{
_data = data;
}
.
.
.
public void Execute(object parameter)
{
BrowseDialog winBrowseDialog = new BrowseDialog(); //Instantiate a new custom dialog box
winBrowseDialog.DataContext = _data; //THIS IS WHERE I SET MY VIEWMODEL TO THE NEW WINDOWS DATACONTEXT
Nullable<bool> BrowseDialogResult = winBrowseDialog.ShowDialog();
.
.
.
I am new to C# and I am just learning the MVVM pattern so while this is probably common knowledge, maybe someone new can save some time. Using the MVVM pattern with one window did not require this step. DataContext is set for my MainWindow in the MainWindow.xaml.cs file so I assumed this could be done for the second windows secondwin.xaml.cs file. The only way I got it to work was by setting the DataContext as shown in the code above ....not in the .cs file.
Upvotes: 1