【发布时间】: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