我不确定如何提出这个问题 - 因此我也不知道如何寻找合适的答案。这是一个简单的场景 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 ;
}
}
答案 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);
}