c# - 订阅 ViewModel 中当前项目的 PropertyChanged

标签 c# mvvm

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

相关文章:

c# - Prism + MVVM + Access Keys + UpdateSourceTrigger ="LostFocus"- 这不会让我在不首先失去焦点的情况下保存更新的文本框

c# - 带虚线的 TreeView/TreeViewItem ControlTemplates

c# - Xamarin.Forms ListView 大小到内容

c# - 如何创建具有顶部 float 控件和自动调整大小的布局?

c# - ASP.NET Web API 方法模型 null

c# - 事件似乎没有正确连接

c# - 与 ViewModel 绑定(bind)的 MVVM 动态菜单 UI

c# - 如果文件名包含特定单词,则从目录中删除文件

C# 如果字符串包含超过 1 个值

wpf - 在 WPF MVVM 命令行为中执行后台任务的首选方法