当我尝试使用CSList作为WPF DataGrid的ItemsSource时,我收到错误
无法将'System.Object []'类型的对象强制转换为'Product []'
我不完全确定可以将它用作绑定源,但根据vici coolstorage几乎不存在的文档,它们的集合应该适合绑定。这是看起来失败的线:
dataGrid1.ItemsSource = Product.List();
有人能告诉我这是否可能,如果是,我做错了什么?
谢谢!
[EDIT]这是堆栈跟踪(略有改动)
at Vici.CoolStorage.CSList`1.System.Collections.ICollection.CopyTo(Array array, Int32 index) in {...}\Vici.CoolStorage\Library\CSListGeneric.cs:line 1070
at System.Collections.ArrayList.InsertRange(Int32 index, ICollection c)
at System.Collections.ArrayList.AddRange(ICollection c)
at System.Collections.ArrayList..ctor(ICollection c)
at System.Windows.Data.BindingListCollectionView.RebuildListsCore()
at System.Windows.Data.BindingListCollectionView.RebuildLists()
at System.Windows.Data.BindingListCollectionView.<SubscribeToChanges>b__1f()
at MS.Internal.Data.SynchronizationInfo.AccessCollection(IEnumerable collection, Action accessMethod, Boolean writeAccess)
at System.Windows.Data.BindingOperations.AccessCollection(IEnumerable collection, Action accessMethod, Boolean writeAccess)
at System.Windows.Data.BindingListCollectionView.SubscribeToChanges()
at System.Windows.Data.BindingListCollectionView..ctor(IBindingList list)
at MS.Internal.Data.ViewManager.GetViewRecord(Object collection, CollectionViewSource cvs, Type collectionViewType, Boolean createView, Func`2 GetSourceItem)
at MS.Internal.Data.DataBindEngine.GetViewRecord(Object collection, CollectionViewSource key, Type collectionViewType, Boolean createView, Func`2 GetSourceItem)
at System.Windows.Data.CollectionViewSource.GetDefaultCollectionView(Object source, Boolean createView, Func`2 GetSourceItem)
at System.Windows.Data.CollectionViewSource.GetDefaultCollectionView(Object source, DependencyObject d, Func`2 GetSourceItem)
at System.Windows.Controls.ItemCollection.SetItemsSource(IEnumerable value, Func`2 GetSourceItem)
at System.Windows.Controls.ItemsControl.OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
at System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal)
at System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
at System.Windows.Controls.ItemsControl.set_ItemsSource(IEnumerable value)
at {...}.ViewProduct..ctor() in {...}\ViewProduct.xaml.cs:line 37
at {...}.MainWindow..ctor() in {...}\MainWindow.xaml.cs:line 26
答案 0 :(得分:1)
虽然这不是问题的解决方案,但它是一种解决方法。根据帖子here:
应该接受Object []数组的ICollection.CopyTo方法,但不要,因为他们想要调用强类型的CopyTo方法
该论坛中的OP通过绑定到其类型集合的显式创建的数组副本来解决该问题。
而不是
TestCollection c = new TestCollection();
c.Add(new Test());
comboBox1.DataSource = c;
comboBox1.DisplayMember = "Text";
他用
TestCollection c = new TestCollection();
c.Add(new Test());
Test[] arr = new Test[c.Count];
c.CopyTo(arr);
comboBox1.DataSource = arr;
comboBox1.DisplayMember = "Text";
我希望有一个解决方案,不需要麻烦的解决方法,但与此同时,这至少让我解决了问题(有点打破了ORM的一些功能,但是......)