【问题标题】:Bind a datagrid one object per cell每个单元格绑定一个数据网格一个对象
【发布时间】:2012-08-16 07:18:47
【问题描述】:

我想将一些对象绑定到WPF 中的datagrid。我非常希望避免使用 DataTable!

考虑以下代码:

public ObservableCollection<ObservableCollection<DataPoint>> GridItems { get; set; }

public class DataPoint : INotifyPropertyChanged
{
    public float Value { get; set; }
    public float OriginalValue { get; set; }
    public bool Highlighted { get; set; }
    public SolidColorBrush HighlightColor { get; set; }
    ...
}

XAML:

<toolkit:DataGrid ItemsSource="{Binding GridItems}" />

当我们将它绑定到DataGrid 而不是每个单元格获取一个 DataPoint 对象时,我们会得到一列带有Count 的属性,如图所示。我尝试过二维数组、自定义类型(继承自 ObservableCollection&lt;DataPoint&gt;)、HierarchicalDataTemplate,但似乎没有任何效果。

我事先不知道会有多少列,但每一行的数字和类型总是相同的。有什么建议吗?

【问题讨论】:

  • 您是否正在自动生成这些列?
  • 你是如何根据Brian S的回答解决你的问题的?

标签: wpf binding datagrid wpftoolkit


【解决方案1】:

如果您考虑您的ItemsSource,ObservableCollection 的ObservableCollections,那么您将认识到网格中的每一行只是一个ObservableCollection 对象。 DataGrid 不够聪明,无法查看每个项目的集合内部(这没有意义 - 每个集合中可能有不同数量的项目,因此它无法自动将项目映射到列) .它只会查看行的 DataContext 对象并将公共属性用作列(在这种情况下,ObservableCollection 的唯一符合条件的属性是 Count)

编辑:我只记得IBindingList 接口,它允许更复杂的绑定场景(我相信这就是DataTable 可以将列公开为属性以进行绑定的方式。看看this answer for有关IBindingList 的信息以及它如何证明有用。您可以创建一个派生自ObservableCollection 并实现IBindingList 的自定义类,以将DataPoints 公开为属性。

原文:

由于您不知道会有多少列,因此您无法通过 XAML 以声明方式对它们进行数据绑定。我相信您将需要在代码中手动创建列并为每列设置 Binding。

此外,您需要为 DataPoint 类型提供DataTemplate,以便它知道如何直观地显示该类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 2022-01-03
    • 2011-01-20
    • 2019-05-02
    相关资源
    最近更新 更多