是否有类似于或类似于INPC接口的路由版本?

时间:2015-08-17 16:57:44

标签: c# inotifypropertychanged routed-events

使用RoutedEvents,您可以执行诸如拥有一个包含数千个子控件的控件,但不是在每个子节点上订阅MouseDown,而是在根控件上设置处理程序并检查' sender&# 39;查找实际点击哪个孩子的属性。

我想知道INPC对象是否有这样的东西,或者如果没有,可以创建一个。

例如,如果您的集合包含数千个全部实现INPC的对象,那么您当前必须单独订阅每个对象。我想知道是否有办法解决这个问题。

我唯一能想到的是你感兴趣的这些属性的setter属性,除了提升标准的INPC通知,调用包含集合中的委托并让集合引发适当的通知。这样,消费者只需为其任何子代订阅集合上的单个处理程序。

我的犹豫是,如果你要这样做,为什么不让这个集合订阅孩子本身,然后从集合中重新提出通知?然而,我的想法是直接从你感兴趣的特定setter调用一个委托,避免在委托此类通知的PropertyChanged处理程序中进行字符串比较。

  

注意:这是伪代码键入的,所以它可能无法编译。它是说明一个概念/想法,而不是实际代码的一个例子。

public class ItemCollection : ObservableCollection<Item>
{
    public EventHandler ChildItemPropertyChanged(object sender, string propertyName);

    internal void RaiseChildItemPropertyChanged(object sender, string propertyName)
    {
        var childItemPropertyChanged = ChildItemPropertyChanged;
        if(childItemPropertyChanged != null)
            childItemPropertyChanged(sender, propertyName);
    }

}

public class Item : INotifyPropertyChanged
{
    public ItemCollection OwningCollection;
    public Item(ItemCollection owningCollection)
    {
        OwningCollection = owningCollection;
    }

    private string _name;
    public string Name
    {
        get{ return _name; }
        set
        {
            if(_name == value)
                return;

            _name = value;

            PropertyChanged(this, "Name");

            OwningCollection.RaiseChildItemPropertyChanged(this, "Name");
        }
    }
}

思想?

0 个答案:

没有答案