将当前所选实体的PropertyChanged事件添加到不良实践中。假设我有一个绑定到List的网格,我已将Grid的SelectedItem绑定到ViewModel的SelectedItem属性。
private Customer _selectedItem;
public Customer SelectedItem
{
get {return _selectedItem;}
set
{
if (!ReferenceEquals(_selectedItem, value))
{
_selectedItem = value;
RaisePropertyChanged(()=>SeletedItem);
_selectedItem.PropertyChanged += OnCustomerPropertyChanged;
}
}
}
这段代码是否有任何缺点,性能明智,内存泄漏,或者像这样使用它是否安全?
答案 0 :(得分:3)
您正在泄露事件订阅。绑定到SelectedItem的想法没有错,但您需要记住以后取消订阅。在订阅和取消订阅之前,您还应该检查您的值:
private Customer _selectedItem;
public Customer SelectedItem
{
get {return _selectedItem;}
set
{
if (!ReferenceEquals(_selectedItem, value))
{
if (!ReferenceEquals(null, _selectedItem))
_selectedItem.PropertyChanged -= OnCustomerPropertyChanged;
_selectedItem = value;
RaisePropertyChanged(()=>SelectedItem);
if (!ReferenceEquals(null, _selectedItem))
_selectedItem.PropertyChanged += OnCustomerPropertyChanged;
}
}
}
否则,当您逐项选择项目时,以前所选项目的所有将使其PropertyChanged事件处理程序挂钩到OnCustomerPropertyChanged
。这反过来可能导致内存泄漏(因为事件处理程序可以阻止事件引发对象被GC)或意外行为。