在WPF Datagrid中为ItemSource创建代理,这可能吗?

时间:2011-03-02 20:06:48

标签: c# wpf datagrid

在我正在进行的项目中,我没有与我的数据网格绑定的普通CLR对象。通常,我会使用ObservableCollection <MyObject>,但现在我不能,而是我必须使用自定义对象(其行为类似于DataTable,但具有自定义逻辑)。

我的问题是:如何创建一个代理/适配器对象,将我的datagrid单元格中的项目的每个绑定操作“转换”为我的自定义逻辑对象?

请记住:

  • 我的对象不是Collection,所以我没有物品。
  • 虚拟物品的“列”可能会发生变化。
  • 在应用程序的某处,我可能会更改该对象中的一个值,并且数据网格必须反映更改

现在我们正在从自定义对象重新创建一个DataTable,以使他的DataView显示在数据网格中,我们拦截带有事件的编辑命令(这很丑陋),然后在每次更改单元格值时从头开始重新加载所有内容。 / p>

我搜索了有关如何实现这一目标的提示,但我找到的是:

  • IItemProperties界面(可能有趣的是有动态列,但我没有集合)
  • DataSourceProvider类(它似乎是ItemsSource的包装器,但我没有看到我必须在Data属性中返回什么内容)
  • INotifyPropertyChanged接口(告知属性已更改,但我没有项目或至少项目没有属性)
  • ICustomTypeDescriptor接口(好的,但是一旦我使用GetProperties()返回属性,datagrid将如何尝试修改不存在的属性?)

正如您所看到的,选择一种实现良好代理的方法令人困惑。

3 个答案:

答案 0 :(得分:1)

我建议创建一种ViewModel作为模型(这个没有集合但被视为一个的神秘对象)和View(DataGrid)之间的适配器。在搜索Model-View-ViewModel时,您会找到此模式的各种示例。 然后您可以自己定义属性,只需要在属性上实现一些合适的get / set-methods,将ViewModel-changes转换为原始Model,反之亦然(如果需要)。

答案 1 :(得分:1)

最后我找到了一个解决方案,我在this web site中使用了第二种方法:并且创建了一个继承自IBindingList和ITypedList的对象来伪造该项是一个列表,我在每个假行上也使用了ICustomTypeDescriptor并调用主表对象。

答案 2 :(得分:0)

.net 4.0可用。您可以通过继承动态属性将在xaml中绑定的DynamicObject(仅限.net 4.0)轻松创建代理。如果您代理DataTable,则必须在代理上实施INotifyCollectionChanged,如果您代理了项目,则需要在其代理上实施INotifyPropertyChanged