Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 投射一个显式的可观察集合_C#_Data Structures_Casting_Observablecollection - Fatal编程技术网

C# 投射一个显式的可观察集合

C# 投射一个显式的可观察集合,c#,data-structures,casting,observablecollection,C#,Data Structures,Casting,Observablecollection,我有一个C#中对象的可观察集合。此对象实现一个接口。我希望能够将对象的ObservableCollection转换为接口的ObservableCollection,而不必通过集合进行解析 ObservableCollection<IMusicalInstrument> InstrumentList = (ObservableCollection<IMusicalInstrument>)MyListBox.ItemsSource; 例如: 我有一个对象“吉他”,

我有一个C#中对象的可观察集合。此对象实现一个接口。我希望能够将对象的ObservableCollection转换为接口的ObservableCollection,而不必通过集合进行解析

    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,原始集合作为项的源。@Steve
To…
通常会返回一个新实例
ToList
ToArray
等等。一旦您开始使用新实例,新返回的
observateCollection
显然将提供该类型附带的所有通知。如果你打算继续使用backing
IEnumerable
,那将如预期的那样,不起作用。事实上,我从问题中得到的印象是,他想要一种“管道”,其中集合中的项目类型发生了更改,但通知却发生了变化