C# 投射一个显式的可观察集合
我有一个C#中对象的可观察集合。此对象实现一个接口。我希望能够将对象的ObservableCollection转换为接口的ObservableCollection,而不必通过集合进行解析C# 投射一个显式的可观察集合,c#,data-structures,casting,observablecollection,C#,Data Structures,Casting,Observablecollection,我有一个C#中对象的可观察集合。此对象实现一个接口。我希望能够将对象的ObservableCollection转换为接口的ObservableCollection,而不必通过集合进行解析 ObservableCollection<IMusicalInstrument> InstrumentList = (ObservableCollection<IMusicalInstrument>)MyListBox.ItemsSource; 例如: 我有一个对象“吉他”,
ObservableCollection<IMusicalInstrument> InstrumentList =
(ObservableCollection<IMusicalInstrument>)MyListBox.ItemsSource;
例如:
我有一个对象“吉他”,它实现了一个名为“IMusicalInstrument”的接口。我将一组吉他对象绑定到我的ListBox。我希望下面的代码行能够将listbox itemsSource转换为ObservableCollection
ObservableCollection<IMusicalInstrument> InstrumentList =
(ObservableCollection<IMusicalInstrument>)MyListBox.ItemsSource;
ObservableCollection仪器列表=
(ObservableCollection)MyListBox.ItemsSource;
目前,这给了我一个无效的例外
有没有办法做到这一点(无需通过集合进行解析)
谢谢,
Seth除非
MyListBox.ItemsSource
是ObservableCollection
的实例,否则不能强制转换它 除非MyListBox.ItemsSource
是ObservableCollection
的实例,否则不能强制转换它 对不起,您不能这样做,因为可观察集合
不能被视为可观察集合
——例如,您不能调用集合。添加(new flut())
。对不起,您不能这样做,因为observedcollection
不能被视为observedcollection
——例如,您不能调用集合。在其上添加(new flut())
。如果您只想管理集合的项目,那么您可以尝试将ItemsSource强制转换为非泛型IList。如果您只想管理集合的项目,然后,您可以尝试将ItemsSource强制转换为非通用IList。如果您只是使用ObservableCollection来处理集合更改事件,则可以强制转换为INotifyCollectionChanged并添加事件处理程序。INotifyCollectionChanged不使用泛型,因此无论如何都必须在事件处理程序中强制转换
但是,如果要枚举IMusicalInstrument实例集合,可以使用Linq Cast()扩展方法。e、 g
IEnumerable<IMusicalInstrument> instruments =
((IEnumerable)MyListBox.ItemsSource).Cast<IMusicalInstrument>();
IEnumerable仪表=
((IEnumerable)MyListBox.ItemsSource.Cast();
希望有帮助 如果您只是使用ObservableCollection来处理集合更改事件,则可以强制转换为INotifyCollectionChanged并添加事件处理程序。INotifyCollectionChanged不使用泛型,因此无论如何都必须在事件处理程序中强制转换 但是,如果要枚举IMusicalInstrument实例集合,可以使用Linq Cast()扩展方法。e、 g
IEnumerable<IMusicalInstrument> instruments =
((IEnumerable)MyListBox.ItemsSource).Cast<IMusicalInstrument>();
IEnumerable仪表=
((IEnumerable)MyListBox.ItemsSource.Cast();
希望有帮助 您不能强制转换它,但是有一种方法是将您的迭代打包,我知道您希望避免这种情况,但不幸的是,无法将其打包为一个
公共静态类集合扩展
{
公共静态ObservableCollection ToObservableCollection(此IEnumerable enumerableList)
{
if(enumerableList!=null)
{
//创建emtpy可观察集合对象
var observableCollection=新的observableCollection();
//循环遍历所有记录并添加到可观察的集合对象
foreach(枚举列表中的变量项)
可观察收集。添加(项目);
//返回填充的可观察集合
返回可观测集合;
}
返回null;
}
}
这将允许您执行以下操作
ObservableCollection<IMusicalInstrument> InstrumentList = MyListBox.ItemsSource.ToObservableCollection<IMusicalInstrument>();
ObservableCollection InstrumentList=MyListBox.ItemsSource.ToObservableCollection();
…这就是我相信你想要的
您还可以简单地将IEnumerable
引用传递到ObservableCollection
的构造函数中
ObservableCollection<IMusicalInstrument> InstrumentList = new ObservableCollection<IMusicalInstrument>(MyListBox.ItemsSource);
ObservableCollection InstrumentList=新的ObservableCollection(MyListBox.ItemsSource);
您不能强制转换它,但有一种方法是将您的迭代打包,我知道您希望避免这种情况,但遗憾的是,无法将其打包为一个新的迭代
公共静态类集合扩展
{
公共静态ObservableCollection ToObservableCollection(此IEnumerable enumerableList)
{
if(enumerableList!=null)
{
//创建emtpy可观察集合对象
var observableCollection=新的observableCollection();
//循环遍历所有记录并添加到可观察的集合对象
foreach(枚举列表中的变量项)
可观察收集。添加(项目);
//返回填充的可观察集合
返回可观测集合;
}
返回null;
}
}
这将允许您执行以下操作
ObservableCollection<IMusicalInstrument> InstrumentList = MyListBox.ItemsSource.ToObservableCollection<IMusicalInstrument>();
ObservableCollection InstrumentList=MyListBox.ItemsSource.ToObservableCollection();
…这就是我相信你想要的
您还可以简单地将IEnumerable
引用传递到ObservableCollection
的构造函数中
ObservableCollection<IMusicalInstrument> InstrumentList = new ObservableCollection<IMusicalInstrument>(MyListBox.ItemsSource);
ObservableCollection InstrumentList=新的ObservableCollection(MyListBox.ItemsSource);
ObservableCollection已经有了一个构造函数来执行此操作。这当然不会提供来自源的通知,只是一个新的ObservableCollection,原始集合作为项的源。@SteveTo…
通常会返回一个新实例ToList
,ToArray
等等。一旦您开始使用新实例,新返回的observateCollection
显然将提供该类型附带的所有通知。如果你打算继续使用backingIEnumerable
,那将如预期的那样,不起作用。事实上,我从问题中得到的印象是,他想要一种“管道”,其中集合中的项目类型发生了更改,但通知却发生了变化