1

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

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

替代问题...您如何查看 IEnumerable 列表是否也通过 1 方法实现 INotifyCollectionChanged [method(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 ;
    }
}
4

1 回答 1

1

对于您的解决方案,您不能避免并避免您myItemsSourceObservableCollection<T>情况吗?

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

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

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

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

bool IsINotifyCollectionChanged<T>(IEnumerable<T> collection)
{
    return (collection is INotifyCollectionChanged);
}
于 2013-09-26T16:40:11.467 回答