C# 访问父ViewModel中的ViewModel属性

C# 访问父ViewModel中的ViewModel属性,c#,wpf,mvvm,navigation,viewmodel,C#,Wpf,Mvvm,Navigation,Viewmodel,我使用此技术在视图之间导航: 我将带有菜单按钮的主ViewModel绑定到SelectedViewModel属性更改命令: class MainViewModel : INotifyPropertyChanged { public ICommand SomeViewCommand { get; set; } public ICommand OtherViewCommand { get; set; } private object selectedViewModel;

我使用此技术在视图之间导航:

我将带有菜单按钮的主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));
        }
    }

}
class MainViewModel:INotifyPropertyChanged
{
公共ICommand SomeViewCommand{get;set;}
公共ICommand OtherViewCommand{get;set;}
私有对象选择视图模型;
公共事件属性更改事件处理程序属性更改;
公共对象选择视图模型
{
获取{返回selectedViewModel;}
设置{selectedViewModel=value;OnPropertyChanged(“selectedViewModel”);}
}
公共主视图模型()
{
SomeViewCommand=newrelaycommand(null,(objecto)=>OpenSomeView());
OtherViewCommand=new RelayCommand(null,(对象o)=>OpenOtherView());
}
私有void OpenSomeView()
{
SelectedViewModel=新建SomeViewModel();
}
私有void OpenOtherView(对象obj)
{
if(SelectedViewModel!=null&&SelectedViewModel.GetType()==typeof(SomeViewModel))
{
SomeViewModels=(SomeViewModel)已选择ViewModel;
//总是0
如果(s.NumberOfChanges>0)
{
MessageBox.Show(“测试”、“错误”);
}
//SelectedViewModel=new OtherViewModel();确认对话框后
}
其他的
SelectedViewModel=new OtherViewModel();
}
私有void OnPropertyChanged(字符串propName)
{
if(PropertyChanged!=null)
{
PropertyChanged(这是新PropertyChangedEventArgs(propName));
}
}
}
如果我在SomeView中,我想在切换到OtherView之前检查它的属性(更改数),并向用户显示确认对话框以确认他们的操作。我需要当前值,但任何属性似乎都有其初始化值。为什么?


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

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

我想
OpenOtherView
中的
CurrentViewModel
应该是
SelectedViewModel
?另外,您确定
NumberOfChanges
SomeViewModel
中确实发生了变化吗?确实,我缩短了代码,以便它只显示需要的内容,并出于某种原因重命名了它,更正了。是的,我确信,在子视图模型中的值是正确的。您发布的代码应该可以从我所知道的工作,因此我怀疑问题在子视图模型中。如果您只需要更改的数量,那么通过Satish建议的子对象的
PropertyChanged
事件来计算父视图模型中的更改也应该可以。我不确定我是否正确理解您的意思,您能否给出一个简短的示例?
private void OnPropertyChanged(string propName){If(PropertyChanged!=null){s.NumberOfChanges++;PropertyChanged(这是新的PropertyChangedEventArgs(propName));}}
类似于上面的内容。因为在更改任何属性时,它都将输入此方法。你可以在那里增加。如果我错了,请纠正我