我有一个视图模型,它从某些服务中检索对象,并使其可用于数据绑定。对象正在实现INotifyPropertyChanged
。在视图模型中,当对象中的某些属性被修改时,我正在监听PropertyChanged
事件以执行一些内部操作。
现在有可能从服务请求一个新对象,完全取代旧对象。考虑到生命周期本质上受到视图模型本身的限制,并且没有其他人持有对它的引用(WPF使用弱侦听器),在这种情况下,我是否需要取消对对象的订阅?当然,我应该使用,在setter中这样做很简单,但是我真的需要使用吗?
public class MyViewModel : INotifyPropertyChanged
{
private DataType myData;
public DataType MyData
{
get { return myData; }
protected set
{
if (value == myData)
return;
if (myData != null)
myData.PropertyChanged -= DataPropertyChanged;
myData = value;
myData.PropertyChanged += DataPropertyChanged;
OnNotifyPropertyChanged("MyData");
}
}
public void UpdateData ()
{
MyData = service.GetData();
}
// ...
}
您实际上不需要做任何事情,但是您应该在完成后将旧对象从事件中分离出来。有两个原因。
如果对象被垃圾收集并且事件被触发,将花费一些时间来确定对象不再存活。希望它将从事件处理程序列表中删除。如果没有,下一次也要花更多的时间,依此类推。
更重要的是,如果你的旧对象没有被垃圾收集,并且事件被触发,你将获得两个事件通知——一次在旧对象中,一次在新对象中。您需要在旧对象中专门处理这种情况(否则,会发生不好的事情)。处理这个问题最简单的方法是当你完成后从事件中分离。