【问题标题】:WPF Bind a DataGrid to all available variables in a classWPF 将 DataGrid 绑定到类中的所有可用变量
【发布时间】:2014-09-01 14:48:48
【问题描述】:

所以我有 4 个类,例如:

Class A Inherits I
Public name as String
Public ID as Integer

Class B Inherits I
Public test as String
Public somethingElse as Integer

Class C Inherits I
Public banana as String
Public Type as String
Public length as Integer

Class D Inherits I
Public name as String
Public ID as String

假设我的 WPF 应用程序中有一个 ComboBox,其中包含 I 对象的列表(一些属于 A 类类型,一些属于 C 类类型等)。

When one is selected, I want the datagrid to populate with the public variables of the selected class - variable names in the left column and values in the right.

我希望右侧的列是可编辑的,但不直接更新类中的变量。

然后,我的问题是 - 如果每个类中的所有/某些变量都不同,我如何将数据网格绑定到选定的类?然后我如何保持与变量的关联,以便在用户所做的更改通过我的自定义验证时稍后更新它?

我的想法(我不知道如何实现):

  • 每个类是否都需要某种 DataGrid 可以绑定的转换器方法?但如果是这样,该方法会返回什么?

  • 我是否只需要跟踪每个类的第 1 行包含此变量等,以便稍后更新?

【问题讨论】:

    标签: wpf vb.net data-binding datagrid


    【解决方案1】:

    如果您在提出问题之前尝试过此操作,那么您可能已经有了答案?在 WPF 中,DataGrid 控件提供了自动生成其列的功能。事实上,这是默认行为,如果您不想要它,您必须将其关闭。但是,就您而言,听起来您希望将其保留。

    您需要在您的代码中使用ObservableCollection<I> 属性或查看模型来将数据绑定到DataGrid.ItemsSource 属性...我们称之为Items

    <DataGrid ItemsSource="{Binding Items}" />
    

    现在,当您更改集合中对象的类型并必须尝试将所有新属性数据绑定到 DataGrid.Columns 集合时,这是棘手的部分:

    List<A> classAItems = GetClassAItems();
    Items = new ObservableCollection<I>(classAItems);
    

    就是这样!显示不同的类?:

    List<B> classBItems = GetClassBItems();
    Items = new ObservableCollection<I>(classBItems);
    

    就是这样!


    更新>>>

    我怎样才能有两列 - “字段”和“值”,每个变量填充一行?

    我之前似乎无意中回答了您的后续问题,而不是您的实际问题。要正确填充 all 列标题,您应该改用 ObservableCollection&lt;object&gt;。要仅在列标题中填充公共属性,您应该声明一个仅包含这些属性的接口。在所有类中实现该接口后,您将能够在同一个 DataGrid 中显示它们(甚至混合在同一个集合中)。

    【讨论】:

    • 谢谢你,我正在使用它。与其将变量名称作为列标题,不如我有两列 - “字段”和“值”,每个变量填充一行?
    • RE:更新 - 谢谢,但这不是我的意思。我不希望属性成为列标题,我希望它们成为“行标题”,如果你愿意的话。所以我的数据网格总是有两列,不管我有多少属性。这有意义吗?
    • 您需要相应地重组您的数据收集以实现这一目标。
    • 谢谢。最后一个问题 - 我如何从数据绑定中隐藏属性,而不是从同一 GUI 中的其他数据绑定中隐藏它们?例如,如果我在父类中有一个字符串需要绑定到标签,但不应该显示在数据网格中,这是否可以完成?
    • 我会单独问这个问题
    猜你喜欢
    • 2015-11-07
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 2017-02-08
    • 2014-12-29
    相关资源
    最近更新 更多