【问题标题】:Accessing ViewModel properties in parent ViewModel访问父 ViewModel 中的 ViewModel 属性
【发布时间】:2017-05-22 05:09:43
【问题描述】:

我正在使用这种技术在视图之间导航:https://social.technet.microsoft.com/wiki/contents/articles/30898.simple-navigation-technique-in-wpf-using-mvvm.aspx

我的主 ViewModel 带有绑定到 SelectedViewModel 属性更改命令的菜单按钮:

class MainViewModel : INotifyPropertyChanged 
{
    public ICommand SomeViewCommand { get; set; }
    public ICommand OtherViewCommand { get; set; }
    private object selectedViewModel;
    public event PropertyChangedEventHandler PropertyChanged;

    public object SelectedViewModel
    {
        get { return selectedViewModel; }
        set { selectedViewModel = value; OnPropertyChanged("SelectedViewModel"); }
    }

    public MainViewModel()
    {
        SomeViewCommand = new RelayCommand<object, object>(null, (object o) => OpenSomeView());
        OtherViewCommand = new RelayCommand<object, object>(null, (object o) => OpenOtherView());
    }

    private void OpenSomeView()
    {
       SelectedViewModel = new SomeViewModel();
    }

    private void OpenOtherView(object obj)
    {
       if(SelectedViewModel != null && SelectedViewModel.GetType() == typeof(SomeViewModel))
       {
          SomeViewModel s = (SomeViewModel)SelectedViewModel;

          // always 0
          if (s.NumberOfChanges > 0)
          {
             MessageBox.Show("test", "Error");
          }

          // SelectedViewModel = new OtherViewModel(); after confirmation dialog
       }
       else
          SelectedViewModel = new OtherViewModel();
    }

    private void OnPropertyChanged(string propName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propName));
        }
    }

}

如果我在 SomeView 中,我想在切换到 OtherView 之前检查其属性(更改次数)并向用户显示确认对话框以确认他们的操作。我需要当前值,但任何属性似乎都有其初始化值。为什么?

这样做最干净的方法是什么?我知道可以通过将属性设为静态来完成,但这对我来说似乎很脏。

【问题讨论】:

  • 我猜OpenOtherView 中的CurrentViewModel 应该是SelectedViewModel?您还确定NumberOfChanges 确实在SomeViewModel 中发生了变化吗?
  • 确实,我缩短了代码,以便它只显示需要的内容并出于某种原因重命名,已更正。是的,我敢肯定,在子 ViewModel 中,值是正确的。
  • 据我所知,您发布的代码应该可以正常工作,因此我怀疑问题出在子 ViewModel 中。如果您只需要更改的数量,那么像 Satish 建议的那样,通过孩子的 PropertyChanged 事件计算父 ViewModel 中的更改应该也可以。

标签: c# wpf mvvm navigation viewmodel


【解决方案1】:

在 OnPropertyChanged 方法中可以设置 NumberOfChanges。

【讨论】:

  • 我不确定我是否理解正确,你能举一个简短的例子吗?
  • private void OnPropertyChanged(string propName) { if (PropertyChanged != null) { s.NumberOfChanges++; PropertyChanged(this, new PropertyChangedEventArgs(propName)); } } 类似上面的东西。因为在更改任何属性时,它都会进入此方法。你可以在那里增加。如果我错了,请纠正我
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多