在测试项目中,我设法在以下场景中自动生成WPF DataGrid列,其中数据存储在Dictionary中,绑定通过PropertyDescriptors执行:
public class People:List<Person>{
...
}
public class Person:Dictionary<string,string>,INotifyPropertyChanged,ICustomTypeDescriptor
{
}
我遇到的问题是在我的现实生活项目中我正在使用MVVM,因此 People ViewModel继承了ViewModelBase,因此无法继承List&lt; Person&gt;。我已经尝试实现IList&lt; Person&gt;而是使用内部列表&lt; Person&gt;并明确地将DataContext设置为IList&lt; Person&gt;参考但是没有用。
我在绑定win表单DataGridView here时看过类似的帖子,所以我想知道WPF中是否存在相同类型的逻辑,主要是,究竟是什么导致ICustomTypeDescriptor实现被拾取继承List&lt; T&gt;当你简单地实现IList&lt; T&gt;时,它就会丢失。代替。
答案 0 :(得分:6)
DataGrid
使用集合的CollectionView
来生成属性。更具体地说,它会将CollectionView
转换为IItemProperties
,默认CollectionView
未实现。如果您未实现IList
(不是通用的),则将使用默认的CollectionView
。
因此,实现非通用IList
接口应该解决这个问题(List<T>
实现两者,这就是为什么它从List<Person>
派生出来的原因。
答案 1 :(得分:1)
由于它没有被提及,我遇到了一个相关的问题,即当没有行时DataGrid
中的列没有自动生成;事实证明,DataGrid
根本没有看到我的IItemProperties
实施(我不知道为什么),但纯粹是在每个ICustomTypeDescriptor
实施用于生成列的单个行对象,但也可以在没有行的情况下导致没有列。
解决方案是在集合类型上实现ITypedList
(我将IItemProperties
实现放在以防万一)。现在,无论是否有行,我都会为我正确生成列。