使用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");
}
}
}
思想?