C# 访问父ViewModel中的ViewModel属性
我使用此技术在视图之间导航: 我将带有菜单按钮的主ViewModel绑定到SelectedViewModel属性更改命令: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;
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));}}
类似于上面的内容。因为在更改任何属性时,它都将输入此方法。你可以在那里增加。如果我错了,请纠正我