7

在一个测试项目中,我设法在以下场景中自动生成 WPF DataGrid 列,其中数据存储在字典中并通过 PropertyDescriptors 执行绑定:

public class People:List<Person>{
     ...
}
public class Person:Dictionary<string,string>,INotifyPropertyChanged,ICustomTypeDescriptor
{

}

我遇到的问题是在我的现实生活项目中,我正在使用 MVVM,所以它是继承 ViewModelBase 的People ViewModel,因此不能继承 List<Person>。我尝试使用内部 List<Person> 实现 IList<Person> 并将 DataContext 显式设置为 IList<Person> 引用,但这不起作用。

我在这里看到了关于绑定 win 表单 DataGridView 的类似帖子,所以我想知道 WPF 中是否适用相同类型的逻辑,主要是什么导致 ICustomTypeDescriptor 实现在继承 List<T> 时被拾取,即当您简单地实现 IList<T> 时丢失。

4

2 回答 2

6

为您的集合DataGrid使用CollectionView来生成属性。更具体地说,它会将默认值未实现的CollectionViewto强制转换为 。如果您不实现(不是通用的),那么将使用默认值。 IItemPropertiesCollectionViewIListCollectionView

因此,实现非通用IList接口应该可以解决这个问题(List<T>实现两者,这就是为什么如果你从 派生它可以工作List<Person>)。

于 2010-04-29T20:33:03.710 回答
1

由于尚未提及,因此我遇到了一个相关问题,即在DataGrid没有行时没有自动生成其中的列;事实证明,DataGrid根本没有查看我的IItemProperties实现(我不知道为什么),而是纯粹使用ICustomTypeDescriptor每个单独的行对象上的实现来生成列,这也有效,但导致没有列时没有行。

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

于 2014-08-11T18:48:17.977 回答