2017-05-22 147 views
0

我使用这种技术用于导航视图之间:https://social.technet.microsoft.com/wiki/contents/articles/30898.simple-navigation-technique-in-wpf-using-mvvm.aspx访问视图模型属性视图模型

我已与结合到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)); 
     } 
    } 

} 

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

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

+0

我猜'OpenOtherView'中的'CurrentViewModel'应该是'SelectedViewModel'?你也确定'NumberOfChanges'实际上在'SomeViewModel'中改变了吗? – Mats391

+0

确实,我缩短了代码,以便它只显示需要什么,并由于某种原因将其更名,并予以更正。是的,我确定,在子ViewModel中,该值是正确的。 – Destroy666

+0

你发布的代码应该从我可以告诉的内容开始工作,所以我怀疑问题在子ViewModel中。如果您只需要更改的次数,那么通过像Satish这样的孩子的'PropertyChanged'事件来计算父ViewModel中的那些变量应该可以工作。 – Mats391

回答

0

在OnPropertyChanged方法中,您可以设置NumberOfChanges。

+0

我不确定我是否正确理解你,你能举一个简短的例子吗? – Destroy666

+0

'private void OnPropertyChanged(string propName) { if(PropertyChanged!= null) { \t s.NumberOfChanges ++; PropertyChanged(this,new PropertyChangedEventArgs(propName)); } } ' 就像上面那样。因为任何财产的变化都会进入这种方法。你可以在那里增加。纠正我,如果我错了 –