订阅未知类型ObservableCollection的CollectionChanged事件

时间:2017-10-13 15:42:40

标签: c# wpf

我正在尝试在通用CollectionChanged中订阅运行时属性的DataTemplateSelector事件,但似乎无法找到获取{{1}的通用形式的方法}。

ObservableCollection<>

我正在尝试概括,以便我可以使用不同的ViewModel和属性名称。

public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
    var ds = item as Orders_VM; 
    ds.SelectedOrders.CollectionChanged += MyGenericChangedEvent;
}

1 个答案:

答案 0 :(得分:2)

CollectionChanged事件不是通用的,所以不要担心。如果是这样,处理它可能确实很困难和复杂。 DataTemplateSelector根本不是通用的。您是否可能在口语意义上表示“通用”,而不是具有一个或多个类型参数的类或方法的.NET意义?最好只在传统的编程意义上使用像“通用”这样的术语,以避免混淆。

您的问题是,您获得了PropertyInfo类型的对象,并且由于某种原因尝试将其转换为INotifyCollectionChanged。显然你不能这样做。您希望该属性的实际值在该类的特定实例上,而不是类成员的Type类的 description

public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
    var propertyInfo = item.GetType().GetProperty(myCollectionPropertyName);

    var propertyValue = propertyInfo.GetValue(item);

    var incc = propertyValue as INotifyCollectionChanged;

    incc.CollectionChanged += yGenericChangeEvent;

一旦你开始工作,你可以稍微压缩一下:

public DataTemplate SelectTemplate(object item, DependencyObject container)
{
    var incc = (INotifyCollectionChanged)item.GetType()
        .GetProperty(myCollectionPropertyName).GetValue(item);

    incc.CollectionChanged += MyGenericChangeEvent;