2012-06-23 61 views
0

對當前選定實體的PropertyChanged事件進行subsribe操作是不好的做法。假設我有一個綁定到List的網格,並且我已經將Grid的SelectedItem綁定到ViewModel的SelectedItem屬性。在ViewModel中的當前項目上訂閱PropertyChanged

private Customer _selectedItem; 
public Customer SelectedItem 
{ 
    get {return _selectedItem;} 
    set 
    { 
     if (!ReferenceEquals(_selectedItem, value)) 
     { 
      _selectedItem = value; 
      RaisePropertyChanged(()=>SeletedItem); 
      _selectedItem.PropertyChanged += OnCustomerPropertyChanged; 
     } 
    } 
} 

這段代碼是否有任何缺點,明智的性能,明智的內存泄漏,還是像這樣使用它是安全的?

回答

3

您正在泄漏活動訂閱。與SelectedItem綁定的想法沒有任何問題,但您需要記住稍後取消訂閱。你也應該爲null檢查訂閱和退訂之前,你的價值:

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

相關問題