简单地使用动态成员/属性实现WPF数据绑定源?

时间:2013-12-26 16:10:12

标签: c# .net wpf data-binding

我正在开发一个允许标记目录的项目。作为界面的一部分,我想显示目录列表。列表中的每个条目都是目录名称和多个列。一个用于当时应用程序已知的每个标记,其中一个复选框指示目录是否已使用该标记进行标记。然后,用户可以轻松地标记或取消标记多个目录。

我认为使用WPF DataGrid对此有好处,但是我很难决定如何以允许我轻松地将其绑定到DataGrid实例的方式存储标记目录,因为数字&标签的构成可以随时改变。

  • 一种方法是拥有目录的主列表&他们的标签,每当已知标签的数量发生变化时,我就可以生成一组互补的Expando对象。每个对象都有一个每个标记的布尔属性。这些对象的列表可以绑定到DataGrid,自动生成的列会自动显示它们。关于这一点的好处是它确实模拟了我正在显示的内容 - 即使目录没有标记,它仍然具有“没有这个标记”的属性,并且它易于实现。问题是它的混乱和低效,并且(不确定)我认为当属性改变时我不能在Expando对象上调用方法。

  • 另一种方法是在已知标签发生变化时动态重新创建DataTemplate。缺点是我必须在代码隐藏中动态创建DataTemplate。

我想知道第一个选项 - 有没有办法覆盖对象似乎对WPF的属性?

例如,是否有类似IDataBindingSource的界面,看起来像

interface IDataBindingSource {
    string[] MyProperties();
    Type[] MyPropertyTypes();
    object[] MyPropertyValues();
}

也就是说,是否有一种简单的方法可以在运行时更改DataGrid中显示的属性(以及使用自动生成的列)?

编辑:澄清标签。按标签我的意思是小的描述性字符串版本。用户想要的标签数量有限,但是有大量目录。所以我想为每个目录显示一组复选框,允许我为该目录添加或删除标签,就像你为用户设置权限一样(每个权限都是标签,用户是目录)。任何给定时间的潜在标签数量都是可变的,因为用户可以添加更多,或从所有目录中删除标签并有效删除它。

这不是一个难题 - 一个非常天真的方法就是手动绘制一个表,一列用于目录,其他列用已知的标记列表,然后逻辑将在单元格中创建和设置复选框带循环。有很多方法可以做到 - 但我想使用最好的方法 - 允许我快速编写代码并保留内置于控件中的功能,如冻结和重新排序等。

1 个答案:

答案 0 :(得分:1)

我从未成为DataGrid控件的粉丝,特别是在WPF中。考虑到WPF在控制模板和样式方面的多样性,我会使用ListView作为内容(GridView)来使用ListView.View

然后你可以废弃整个复杂的IDataBindingSource位并直接使用MVVM,使用标准绑定会更容易。

例如,您可以拥有一个类似于此的DirectoryModel类:

public sealed class DirectoryModel : INotifyPropertyChanged
{
  public ObservableCollection<DirectoryModel> Subdirectories { get; set; }

  // Notify when this property changes for proper binding behavior!
  public bool IsTagged { get; set; }
}

然后您的ListViewItem.IsSelected属性将绑定到DirectoryModel.IsTagged