1

订阅当前选定实体的 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;
        }
    }
}

这段代码是否有任何缺点,性能方面,内存泄漏方面,或者像这样使用它是安全的?

4

1 回答 1

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)或意外行为。

于 2012-06-23T18:22:23.687 回答