通过ICustomTypeDescriptor生成WPF DataGrid AutoColumn

时间:2010-04-29 14:21:06

标签: c# wpf icustomtypedescriptor

在测试项目中,我设法在以下场景中自动生成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;时,它就会丢失。代替。

2 个答案:

答案 0 :(得分:6)

DataGrid使用集合的CollectionView来生成属性。更具体地说,它会将CollectionView转换为IItemProperties,默认CollectionView未实现。如果您未实现IList(不是通用的),则将使用默认的CollectionView

因此,实现非通用IList接口应该解决这个问题(List<T>实现两者,这就是为什么它从List<Person>派生出来的原因。

答案 1 :(得分:1)

由于它没有被提及,我遇到了一个相关的问题,即当没有行时DataGrid中的列没有自动生成;事实证明,DataGrid根本没有看到我的IItemProperties实施(我不知道为什么),但纯粹是在每个ICustomTypeDescriptor实施用于生成列的单个行对象,但也可以在没有行的情况下导致没有列。

解决方案是在集合类型上实现ITypedList(我将IItemProperties实现放在以防万一)。现在,无论是否有行,我都会为我正确生成列。