【问题标题】:MVVM Light pass parameters to child view modelMVVM Light 将参数传递给子视图模型
【发布时间】:2013-02-14 22:57:57
【问题描述】:

我是 MVVM 和 WPF 的新手。

我正在使用 MVVM Light 制作一个应用程序,该应用程序在一个窗口中包含一个 DataGrid,该窗口具有一个视图模型 (MainViewModel) 和另一个用于在 DataGrid 中添加和编辑记录的窗口,该窗口也有自己的视图模型 (EditViewModel) .

我担心的是我用来从 MainViewModel 打开“添加/编辑”窗口的方法。在 MainViewModel 中,我有一个属性 SelectedItem,它绑定到 DataGrid 的 SelectedItem 属性和一个 IsEdit 布尔属性,指示是否应在添加或编辑模式下启动添加/编辑窗口。

当添加/编辑窗口在编辑模式下打开时,在其视图模型的构造函数中我有以下行:

 MainViewModel mainViewModel = ServiceLocator.Current.GetInstance<MainViewModel>();

这显然会检索 MainViewModel 的当前实例,它工作得非常好,但我不确定这是不是最好的方法。

此外,如果我有多个主窗口实例,它们使用相同的 MainViewModel 实例,并且我从这两个实例中打开添加/编辑窗口的一个实例,则添加/编辑窗口将从MainViewModel 的同一实例,这可能是个问题。

如果我尝试为打开的每个 MainWindow 创建一个新的 MainViewModel 实例,那么我不知道如何将当前使用的 MainViewModel 的实例传递给 EditViewModel。

我希望我清楚我需要做什么。如果我遗漏了什么,请告诉我,我会补充:)

提前致谢

【问题讨论】:

    标签: wpf datagrid viewmodel mvvm-light viewmodellocator


    【解决方案1】:

    您好,如果我没有误解您的问题,您可以这样做: 因为我在 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));
        }
    }
    

    这只是一种假动作,但可以让您了解如何做到这一点。我已经在假人中尝试过它并且工作正常。

    【讨论】:

    • 对不起。我想你误解了我的问题。我需要做的是将 DataGrid 中的选定对象传递给 Edit 视图模型,以便窗口可以显示其数据并允许从那里对其进行编辑。
    猜你喜欢
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多