C# 更改对象I';时是否需要删除事件侦听器;我在听什么?
我的WPF视图模型中有一些“传递”属性,它们使用PropertyChange事件来更新相关属性(例如aC# 更改对象I';时是否需要删除事件侦听器;我在听什么?,c#,wpf,C#,Wpf,我的WPF视图模型中有一些“传递”属性,它们使用PropertyChange事件来更新相关属性(例如aFullname=FirstName+SecondName) 在此之前,我刚刚做了以下工作: public KPIViewModel KPIViewModel { get { return kpiViewModel; } set { if (kpiViewModel != value)
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_属性changed可能会挂起?我是否应该这样做:
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_属性之前,是否删除已更改的现有KpiViewModel_属性
编辑:对于“您应该将其放入实际KPIViewModel类中属性的setter中”,如果我理解,您认为我应该这样做:
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);
}
}
比如说,我有一个非常简单的例子,一个布尔值,表示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中处理kPriviewModel
PropertyChanged
事件。为什么不在KPIViewModel
本身中处理属性changed
(正如您通常期望的那样)。如果KPIViewModel
需要访问容器ViewModel上的成员,那么只需在KPIViewModel上设置一个属性,即容器ViewModel(this,在上面的属性方法中)旧的KPIViewModel
,在这种情况下,我不认为它会很长,因为它通常是从视图的持久化模型生成的,使用后会被丢弃。但是我在其他情况下对模型做了类似的事情。如何创建属性KPIViewModel
?如果每次创建KPIViewModel
的新实例时,取消订阅PropertyChanged
事件都是无用的,因为您使用的是对象的新实例。在这种情况下,此时KPIViewModel不是在构造函数中创建的,而是始终在创建时设置一次。我不能说这种情况是否总是会发生,尽管很可能会发生。为什么您需要订阅kpiViewModel.PropertyChanged
?因为您可以只调用必要的方法(在您的事件处理程序中),而无需任何sunscribing。只需在KPIViewModel
属性的setter中编写一个必要的方法。这对我来说似乎是一个糟糕的主意,我已经尝试在编辑中演示了如何操作(注释中的代码不好)。