Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 订阅ViewModel中当前项上已更改的属性_C#_Mvvm - Fatal编程技术网

C# 订阅ViewModel中当前项上已更改的属性

C# 订阅ViewModel中当前项上已更改的属性,c#,mvvm,C#,Mvvm,订阅当前所选实体的PropertyChanged事件是否是一种不良做法。假设我有一个绑定到列表的网格,并将网格的SelectedItem绑定到ViewModel的SelectedItem属性 private Customer _selectedItem; public Customer SelectedItem { get {return _selectedItem;} set { if (!ReferenceEquals(_selectedItem, v

订阅当前所选实体的PropertyChanged事件是否是一种不良做法。假设我有一个绑定到列表的网格,并将网格的SelectedItem绑定到ViewModel的SelectedItem属性

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