属性从ObservableCollectio <t>更改为Main class

时间:2016-04-21 08:48:22

标签: wpf data-binding

我认为这是一个愚蠢的问题,但是......

我有一个带有Treeview绑定到Observablecollection<T> foo; T的Window类是我的类(在另一个文件.cs中)。 我的Observablecollection fooOnPropertyChanged添加/删除元素,工作正常。 问题出在我的班级T上:它有5个属性,其中一个有OnPropertyChanged:当我以编程方式更改我的班级元素时,TI OnPropertyChanged中有class T(显然)但...我如何才能从Window课程中了解它做什么?

1 个答案:

答案 0 :(得分:0)

您希望能够在observable集合中的项目上监听propertychange事件吗?

为此,我创建了一个ObsercableCollection扩展,将这些事件冒泡到集合级别,因此我可以订阅collection.CollectionChanged(添加和删除项)和collection.ItemInCollectionChange(集合中项目的属性具有改变后的):

//public class ItemInCollectionChangeEventArgs
public class ItemInCollectionChangeEventArgs : EventArgs
{
    public object Item { get; internal set; }
    public PropertyChangedEventArgs PropertyChangedEventArgs { get; internal set; }
}

public delegate void ItemInCollectionChangeEventHandler(Object sender, ItemInCollectionChangeEventArgs e);

//TODO Make this throw a separate event for refreshing
public class ItemsChangeObservableCollection<T> :
       ObservableCollection<T> where T : INotifyPropertyChanged
{
    public event ItemInCollectionChangeEventHandler ItemInCollectionChangeEvent;

    public ItemsChangeObservableCollection() : base()
    {
    }

    public ItemsChangeObservableCollection(IEnumerable<T> collection) : base()
    {
        foreach (T item in collection)
        {
            Add(item);
        }
    }

    protected virtual void OnItemInCollectionChange(ItemInCollectionChangeEventArgs e)
    {
        ItemInCollectionChangeEventHandler handler = ItemInCollectionChangeEvent;
        if (handler != null)
        {
            handler(this, e);
        }
    }

    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == NotifyCollectionChangedAction.Add)
        {
            RegisterPropertyChanged(e.NewItems);
        }
        else if (e.Action == NotifyCollectionChangedAction.Remove)
        {
            UnRegisterPropertyChanged(e.OldItems);
        }
        else if (e.Action == NotifyCollectionChangedAction.Replace)
        {
            UnRegisterPropertyChanged(e.OldItems);
            RegisterPropertyChanged(e.NewItems);
        }

        base.OnCollectionChanged(e);
    }

    protected override void ClearItems()
    {
        UnRegisterPropertyChanged(this);
        base.ClearItems();
    }

    private void RegisterPropertyChanged(IList items)
    {
        foreach (INotifyPropertyChanged item in items)
        {
            if (item != null)
            {
                item.PropertyChanged += new PropertyChangedEventHandler(item_PropertyChanged);
            }
        }
    }

    private void UnRegisterPropertyChanged(IList items)
    {
        foreach (INotifyPropertyChanged item in items)
        {
            if (item != null)
            {
                item.PropertyChanged -= new PropertyChangedEventHandler(item_PropertyChanged);
            }
        }
    }

    private void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        OnItemInCollectionChange(new ItemInCollectionChangeEventArgs { Item = sender, PropertyChangedEventArgs = e });
        //base.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
    }
}