簡體   English   中英

綁定到列表 <myType> WPF

[英]Binding to List<myType> WPF

我有myType1帶有依賴項屬性string Text myType1 myType2了包含依賴項屬性ObservableCollection<myType1> Items 我也有Items圖形表示。 當我按下按鈕時,它將myType1.Text設置為null Item.TextItems為空我想刪除這個項目。 我嘗試通過`

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;
    }
}`

在myType1內部創建一個引用myType2的屬性,這樣,如果myType1內部的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;
    }
}
  1. 在每個構造函數中,我都訂閱CollectionChanged事件。
  2. CollectionChanged處理程序方法中,我訂閱每個項目的PropertyChanged
  3. PropertyChanged處理程序方法中,我編寫所需的行為。 猜猜這對某人會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM