我是MVVM和WPF的新手。
我正在使用MVVM Light制作一个包含窗口内DataGrid的应用程序,该窗口具有视图模型(MainViewModel)和另一个用于在DataGrid中添加和编辑记录的窗口,该窗口也有自己的视图模型(EditViewModel)
我担心的是我用来从MainViewModel打开Add / Edit窗口的方法。在MainViewModel中,我有一个属性SelectedItem,它绑定到DataGrid的SelectedItem属性和一个IsEdit布尔属性,指示是否应该在添加或编辑模式下启动添加/编辑窗口。
在编辑模式下打开“添加/编辑”窗口时,在其视图模型的构造函数中,我有以下行:
MainViewModel mainViewModel = ServiceLocator.Current.GetInstance<MainViewModel>();
这显然是检索MainViewModel的当前实例,它工作得很好,但我不确定这是最好的方法。
此外,如果我有多个主窗口实例,它使用相同的MainViewModel实例,并且我从两个实例中打开添加/编辑窗口的实例,则添加/编辑窗口将从中获取数据MainViewModel的同一个实例可能有问题。
如果我尝试为我打开的每个MainWindow创建一个MainViewModel的新实例,那么我就不知道如何将当前使用的MainViewModel的实例传递给EditViewModel。
我希望我明确表示我需要做什么。告诉我,如果我错过了什么,我会添加它:)
提前致谢
答案 0 :(得分:0)
如果我没有误解你的问题,你可以这样做: 因为我在MainView和EditView中都需要IsRequired依赖属性我创建了一个扩展Window类的类
public class ExtendedWindow:Window
{
public static readonly DependencyProperty IsRequiredProperty = DependencyProperty.Register("IsRequired", typeof(bool), typeof(ExtendedWindow));
public bool IsRequired
{
get { return (bool)GetValue(IsRequiredProperty); }
set { SetValue(IsRequiredProperty, value); }
}
}
MainView和ViewModel
public partial class MainWindow:ExtendedWindow
{
public MainWindow()
{
InitializeComponent();
DataContext = new MainViewModel();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
EditView editView = new EditView();
**((EditViewModel)editView.DataContext).IsRequired = this.IsRequired;**
editView.Show();
}
}
public class MainViewModel : INotifyPropertyChanged
{
public MainViewModel()
{
IsRequired = true;
}
private bool isRequired;
public bool IsRequired
{
get { return isRequired; }
set { isRequired = value; Notify("IsRequired"); }
}
public event PropertyChangedEventHandler PropertyChanged;
private void Notify(string propName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
EditView和ViewModel
public partial class EditView:ExtendedWindow
{
public EditView()
{
InitializeComponent();
DataContext = new EditViewModel();
}
}
public class EditViewModel : INotifyPropertyChanged
{
private bool isRequired;
public bool IsRequired
{
get { return isRequired; }
set { isRequired = value; Notify("IsRequired"); }
}
public event PropertyChangedEventHandler PropertyChanged;
private void Notify(string propName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
这只是假的,但可以让你知道如何做到这一点。我已经尝试过它,并且工作正常。