绑定到列表 <myType> WPF

Binding to List<myType> WPF

myType1 有一个依赖 属性 string Text。我创建了包含依赖项 属性 ObservableCollection<myType1> ItemsmyType2。我也有 Items 的图形表示。当我按下按钮时,它会将 myType1.Text 设置为 null。当 Items 中的 Item.Text 为空时,我想删除此项。我尝试通过`

来做到这一点
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 中的文本 属性 设置为空,它可以自行删除。

根据文档,当项目的 属性 更改时,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 处理程序方法中,我编写了所需的行为。 猜猜它会对某人有所帮助。