订阅INotifyCollection通过自定义控件中的IEnumerable更改事件

时间:2013-09-26 16:24:23

标签: c# wpf list

我不确定如何提出这个问题 - 因此我也不知道如何寻找合适的答案。这是一个简单的场景 1.我有一个自定义控件(myControl),其属性名为myItemsSource,属于IEnumerable类型 - 我需要这个,这样当我使用控件时我可以使用list / observable collection / IEnumerable等。 2.然后我的属性使用包装器来获取此IEnumerable列表的逻辑。包装器有一些Ovservable列表/普通列表,然后在后台绑定到myControl上的几个ItemsControl元素。

因此,请记住,当我在应用程序中使用myControl时,我只将一个列表绑定为IEnumerable。当我绑定Observable Collection时,我想要相同的功能(即通知用户界面 - 因此如何通知我的包装器列表中的Items已更改?我无法订阅包装器中的事件,因为我使用了IEnumerable这意味着即使我将Observablecollections用于我的包装器中的列表并将几个控件绑定到这些列表......它们也不会被更新,因为我的包装器没有被通知项目已经改变了?但是我知道这些项目甚至在我的已添加包装器...如何将通知发送到我的包装器,以便它可以重新计算列表 - 更新几个将更新我的用户界面的其他列表?

替代问题...你怎么看IEnumerable列表是否也通过1方法实现了INotifyCollectionChanged [方法(IEnumerable list); ] - >这可能会让我到正确的地方。

感谢下面的Khan,我来到了以下解决方案(我在这里输入它,因为以这种方式查看答案更简单)。请投票给他,因为他的快速反应对我有很大帮助!!

public class Wrapper
{
    INotifyCollectionChanged INC;

    public Wrapper(IEnumerable list)
    {

        if (list is INotifyCollectionChanged)
        {
            INC = list as INotifyCollectionChanged;
            INC.CollectionChanged += INC_CollectionChanged;
        }
    }

    void INC_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    { 
        // Some Code ;
    }
}

1 个答案:

答案 0 :(得分:1)

对于您的解决方案,您是否无法myItemsSource ObservableCollection<T>并避开您的情况?

  

您如何看待IEnumerable列表是否也实现了   INotifyCollectionChanged

您可以使用is关键字检查实体是否实现了接口。

var myCollection = new ObservableCollection<string>();
var isINotifyCollectionChanged = (myCollection is IsNotifyCollectionChanged);

如果您想要针对您的案例采用特定方法:

bool IsINotifyCollectionChanged<T>(IEnumerable<T> collection)
{
    return (collection is INotifyCollectionChanged);
}