MVVM Light将参数传递给子视图模型

时间:2013-02-14 22:57:57

标签: wpf datagrid viewmodel mvvm-light viewmodellocator

我是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。

我希望我明确表示我需要做什么。告诉我,如果我错过了什么,我会添加它:)

提前致谢

1 个答案:

答案 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));
    }
}

这只是假的,但可以让你知道如何做到这一点。我已经尝试过它,并且工作正常。