转换显式ObservableCollection

时间:2011-01-20 19:44:07

标签: c# data-structures casting observablecollection

我在C#中有一个ObservableCollection对象。该对象实现了一个接口。我希望能够将对象的ObservableCollection转换为接口的ObservableCollection,而无需解析集合。

例如:

我有一个“吉他”对象,它实现了一个名为“IMusicalInstrument”的界面。我将一个ObservableCollection的Guitar对象绑定到MyListBox。我希望以下代码行能够将listbox itemsSource转换为ObservableCollection。

    ObservableCollection<IMusicalInstrument> InstrumentList = 
(ObservableCollection<IMusicalInstrument>)MyListBox.ItemsSource;

目前,这给了我一个InvalidCastException。

有没有办法实现这一点(无需解析整个集合)?

谢谢, 塞特

5 个答案:

答案 0 :(得分:2)

你无法施放它,但是一种方法是包装你知道你想要避免的迭代,但不幸的是不能进入extension method

public static class CollectionExtensions
{
    public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> enumerableList)
    {
        if (enumerableList != null)
        {
            //create an emtpy observable collection object
            var observableCollection = new ObservableCollection<T>();

            //loop through all the records and add to observable collection object
            foreach (var item in enumerableList)
                observableCollection.Add(item);

            //return the populated observable collection
            return observableCollection;
        }
        return null;
    }
}

这可以让你做类似的事情......

ObservableCollection<IMusicalInstrument> InstrumentList = MyListBox.ItemsSource.ToObservableCollection<IMusicalInstrument>();

......这就是我相信你所追求的。

您也可以简单地将IEnumerable<T>引用传递给ObservableCollection<T>的构造函数...

ObservableCollection<IMusicalInstrument> InstrumentList = new ObservableCollection<IMusicalInstrument>(MyListBox.ItemsSource);

答案 1 :(得分:1)

除非MyListBox.ItemsSourceObservableCollection<IMusicalInstrument>的实例,否则你不能投出它。

答案 2 :(得分:1)

抱歉,您无法执行此操作,因为ObservableCollection<Guitar>不能视为ObservableCollection<IMusicalInstrument> - 例如你不能打电话给collection.Add(new Flute())

答案 3 :(得分:0)

如果您只想管理集合的项目,那么您可以尝试将ItemsSource转换为非通用IList。

答案 4 :(得分:0)

如果您只是使用ObservableCollection处理集合已更改事件,则可以转换为INotifyCollectionChanged并添加事件处理程序。 INotifyCollectionChanged不使用泛型,因此无论如何都必须在事件处理程序中进行转换。

但是,如果要枚举IMusicalInstrument实例的集合,可以使用Linq Cast()扩展方法。 e.g。

IEnumerable<IMusicalInstrument> instruments = 
     ((IEnumerable)MyListBox.ItemsSource).Cast<IMusicalInstrument>();

希望有所帮助!