【问题标题】:Binding to List<myType> WPF绑定到 List<myType> WPF
【发布时间】:2015-03-25 01:12:59
【问题描述】:

我有 myType1 和一个依赖属性 string Text。我创建了包含依赖属性ObservableCollection&lt;myType1&gt; 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;
    }
}`

【问题讨论】:

  • 如果这不会引发枚举异常 -- ocdp.Remove(sdp); ?
  • 对,打错了,应该是 sdp.Text == null。

标签: c# wpf binding dependency-properties


【解决方案1】:

在 myType1 中创建一个引用 myType2 的属性,这样如果 myType1 中的 text 属性设置为 null,它可以自行删除。

【讨论】:

  • 但更清楚的是,它使用了订阅者设计模式,将此逻辑放在列表实现中会“隐藏”此行为。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多