C# 订阅ViewModel中当前项上已更改的属性
订阅当前所选实体的PropertyChanged事件是否是一种不良做法。假设我有一个绑定到列表的网格,并将网格的SelectedItem绑定到ViewModel的SelectedItem属性C# 订阅ViewModel中当前项上已更改的属性,c#,mvvm,C#,Mvvm,订阅当前所选实体的PropertyChanged事件是否是一种不良做法。假设我有一个绑定到列表的网格,并将网格的SelectedItem绑定到ViewModel的SelectedItem属性 private Customer _selectedItem; public Customer SelectedItem { get {return _selectedItem;} set { if (!ReferenceEquals(_selectedItem, v
private Customer _selectedItem;
public Customer SelectedItem
{
get {return _selectedItem;}
set
{
if (!ReferenceEquals(_selectedItem, value))
{
_selectedItem = value;
RaisePropertyChanged(()=>SeletedItem);
_selectedItem.PropertyChanged += OnCustomerPropertyChanged;
}
}
}
这段代码在性能、内存泄漏方面是否有任何缺点,或者像这样使用它是安全的?您正在泄漏事件订阅。绑定到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’d)或意外行为