在ViewModel中订阅当前项目上的PropertyChanged

时间:2012-06-23 18:01:53

标签: c# mvvm

将当前所选实体的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;
        }
    }
}

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

1 个答案:

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