我的WPF ViewModel中有一些“传递”属性,这些属性使用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类的属性的设置器中”,如果我理解它,您认为我应该做这样的事情:
说,我有一个非常简单的案例,一个布尔值,代表是否应该在屏幕上显示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接口的原因吗?
最佳答案
我认为,实现类似目的的最干净方法是不处理包含的ViewModel中的kpiViewModel PropertyChanged
事件。为什么不处理PropertyChanged
本身中的KPIViewModel
(通常会如此)。如果KPIViewModel
需要访问容器ViewModel上的成员,则只需在KPIViewModel上设置一个属性,即容器ViewModel(在上述Property方法中)
关于c# - 更改正在监听的对象时,是否需要删除事件监听器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37165777/