订阅当前选定实体的 PropertyChanged 事件是不好的做法。假设我有一个绑定(bind)到 List 的网格,并且我已将 Grid 的 SelectedItem 绑定(bind)到 ViewModel 的 SelectedItem 属性。
private Customer _selectedItem;
public Customer SelectedItem
{
get {return _selectedItem;}
set
{
if (!ReferenceEquals(_selectedItem, value))
{
_selectedItem = value;
RaisePropertyChanged(()=>SeletedItem);
_selectedItem.PropertyChanged += OnCustomerPropertyChanged;
}
}
}
这段代码是否有任何缺点,性能方面,内存泄漏方面,或者像这样使用它是安全的?
最佳答案
您正在泄漏事件订阅。绑定(bind)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 事件处理程序 Hook 到
OnCustomerPropertyChanged
.这反过来可能导致内存泄漏(因为事件处理程序可以防止事件引发对象被 GC)或意外行为。
关于c# - 订阅 ViewModel 中当前项目的 PropertyChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11171755/