我的WPF ViewModels中有一些“传递”属性,它们使用PropertyChange事件来更新相关属性(例如Fullname = FirstName + SecondName
)。
以前,我刚刚这样做了:
public KPIViewModel KPIViewModel
{
get { return kpiViewModel; }
set
{
if (kpiViewModel != value)
{
kpiViewModel = value;
if (kpiViewModel != null)
{
kpiViewModel.PropertyChanged += KpiViewModel_PropertyChanged;
}
NotifyOfPropertyChange(() => KPIViewModel);
}
}
}
但是,如果我改变KPIViewModel对象,大概是KpiViewModel_PropertyChanged会挂起来吗?我应该这样做:
public KPIViewModel KPIViewModel
{
get { return kpiViewModel; }
set
{
if (kpiViewModel != value)
{
if (kpiViewModel != null)
{
kpiViewModel.PropertyChanged -= KpiViewModel_PropertyChanged;
}
kpiViewModel = value;
if (kpiViewModel != null)
{
kpiViewModel.PropertyChanged += KpiViewModel_PropertyChanged;
}
NotifyOfPropertyChange(() => KPIViewModel);
}
}
}
在将新的KpiViewModel_PropertyChanged添加到新对象之前删除现有的KpiViewModel_PropertyChanged?
编辑:为了回应“你应该把它放在实际的KPIViewModel类中的属性的setter中”,如果我理解它,你认为我应该这样做:
说,我有一个非常简单的情况,一个布尔值表示是否应该在屏幕上显示viewModel,我有几个不同的视图显示它,也许我也想对它执行一些其他随机动作更新,我最终得到这样的东西:
private bool show;
public bool Show
{
get { return show; }
set
{
if (show != value)
{
show = value;
if (MySummaryPageViewModel != null)
{
MySummaryPageViewModel.UpdateFilter();
}
if (MyPickedDialogViewModel != null)
{
MyPickedDialogViewModel.UpdateFilter();
}
if (MyPerformSomeOtherRandomActionViewModel != null)
{
MyPerformSomeOtherRandomActionViewModel.DoThatThing();
}
NotifyOfPropertyChange(() => Show);
}
}
当然这不合情理。 KPI ViewModel肯定不会与所有这些其他对象逻辑有关。首先,对我来说似乎很难维护,并且KPI将不得不保留所有这些内容的引用,只是为了通知他们属性的变化。
这不正是INotifyPropertyChange接口存在的原因吗?
答案 0 :(得分:0)
在我看来,实现类似功能的最简洁方法是不在包含ViewModel中处理kpiViewModel PropertyChanged
事件。为什么不处理PropertyChanged
本身的KPIViewModel
(正如您通常所期望的那样)。如果KPIViewModel
需要访问容器ViewModel上的成员,那么只需在KPIViewModel上设置一个属性ViewPodel(上面的Property方法中 this )