2015-03-25 59 views
0

我有myType1帶有一個依賴項屬性string Text。我編寫了myType2,其中包含依賴項屬性ObservableCollection<myType1> Items。我也有Items的圖形表示。當我按下按鈕時,它將myType1.Text設置爲null。當Item.TextItems爲空時,我想刪除此項目。我試圖通過'綁定到列表<myType> WPF

private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) 
     { 
      ObservableCollection<StringDP> ocdp = e.NewValue as ObservableCollection<StringDP>; 
      foreach (var sdp in ocdp) 
      { 
       if (sdp == null) 
       { 
        ocdp.Remove(sdp); 
       } 
      } 
      dependencyObject.SetValue(e.Property, ocdp); 
     } 

但是當Item.Text被設置爲null時不會引發。我究竟做錯了什麼。謝謝!

更新

根據文檔ObservableCollection當項目的屬性更改不會引發CollectionChanged事件。我通過繼承ObservableCollection解決了我的問題。

`public class ElObservableCollection<T>: ObservableCollection<T> where T: INotifyPropertyChanged 
{ 
    public ElObservableCollection(): base() 
    { 
     CollectionChanged += OnCollectionChanged; 
    } 

    public virtual void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     if (e.NewItems != null) 
     { 
      foreach (var item in Items) 
      { 
       item.PropertyChanged += OnItemChanged; 
      } 
     } 
     if (e.OldItems != null) 
     { 
      foreach (var item in Items) 
      { 
       item.PropertyChanged -= OnItemChanged; 
      } 
     } 
    } 

    private void OnItemChanged(object sender, PropertyChangedEventArgs e) 
    { 
     if (e.PropertyName == "TextProperty" && sender is StringDP) 
     { 
      StringDP sdp = sender as StringDP; 
      if (sdp.Text == null) 
      { 
       this.Remove((T) sender); 
      } 
     } 
    } 

    public ElObservableCollection(List<T> list) 
     : base(list) 
    { 
     CollectionChanged += OnCollectionChanged; 
    } 

    public ElObservableCollection(IEnumerable<T> collection) 
     : base(collection) 
    { 
     CollectionChanged += OnCollectionChanged; 
    } 
}` 
+0

應該不會引發枚舉異常 - ocdp.Remove(sdp); ? – Muds 2015-03-25 08:49:52

+0

是的,這是一個錯誤,應該是sdp.​​Text == null。 – metacube 2015-03-25 22:59:39

回答

0

根據文檔ObservableCollection在item的屬性發生更改時不會引發CollectionChanged事件。我通過繼承ObservableCollection解決了我的問題。

public class ElObservableCollection<T>: ObservableCollection<T> where T: INotifyPropertyChanged 
{ 
    public ElObservableCollection(): base() 
    { 
     CollectionChanged += OnCollectionChanged; 
    } 

    public virtual void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     if (e.NewItems != null) 
     { 
      foreach (var item in Items) 
      { 
       item.PropertyChanged += OnItemChanged; 
      } 
     } 
     if (e.OldItems != null) 
     { 
      foreach (var item in Items) 
      { 
       item.PropertyChanged -= OnItemChanged; 
      } 
     } 
    } 

    private void OnItemChanged(object sender, PropertyChangedEventArgs e) 
    { 
     if (e.PropertyName == "TextProperty" && sender is StringDP) 
     { 
      StringDP sdp = sender as StringDP; 
      if (sdp.Text == null) 
      { 
       this.Remove((T) sender); 
      } 
     } 
    } 

    public ElObservableCollection(List<T> list) 
     : base(list) 
    { 
     CollectionChanged += OnCollectionChanged; 
    } 

    public ElObservableCollection(IEnumerable<T> collection) 
     : base(collection) 
    { 
     CollectionChanged += OnCollectionChanged; 
    } 
} 
  1. 在每一個構造我的CollectionChanged事件訂閱。
  2. CollectionChanged處理方法我訂購了每個項目的PropertyChanged
  3. PropertyChanged處理程序方法我寫需要的行爲。 猜猜這對別人有幫助。
0

在myType1中創建一個引用myType2的屬性,這種方式如果myType1中的text屬性設置爲null,它可以刪除它自己。

+0

在我看來,這不是一個好方法。 – metacube 2015-03-25 23:02:10

+0

但它更清晰,因爲它使用訂戶設計模式,將此邏輯放在列表實現中會「隱藏」這種行爲。 – 2015-03-28 07:10:27