【问题标题】:bind object with lists to DataGrid将带有列表的对象绑定到 DataGrid
【发布时间】:2014-06-29 02:32:34
【问题描述】:

我有以下包含一些列表的类:

public class Trajectory
{
    public List<double> Radii { get; set; }
    public List<double> Phis  { get; set; }
}

我想要一个看起来像这样的 DataGrid:

| Radii | Phis |
----------------
|  4.5  |  10  |
|  5.5  |  20  |
|  6.5  |  30  |
|  7.5  |  40  |

到目前为止,我所做的是在我的 xaml 中有两个 DataGrids:

<DataGrid x:Name="TrajectoryRadiiDataGrid">
<DataGrid x:Name="TrajectoryPhiDataGrid"/>

在代码隐藏中:

Trajectory trajectory = new Trajectory() { Radii = new List<double>() { 4.5, 5.5, 6.5, 7.5 }, Phis = new List<double>() { 10, 20, 30, 40} };

DataGridTextColumn radiusColumn = new DataGridTextColumn();
radiusColumn.Header = "Radii";
radiusColumn.Binding = new Binding("");
TrajectoryRadiiDataGrid.Columns.Add(radiusColumn);
TrajectoryRadiiDataGrid.ItemsSource = trajectory.Radii;

DataGridTextColumn phiColumn = new DataGridTextColumn();
phiColumn.Header = "Phis";
phiColumn.Binding = new Binding("");
TrajectoryPhiDataGrid.Columns.Add(phiColumn);
TrajectoryPhiDataGrid.ItemsSource = trajectory.Phis;

但这不可能是圣杯!

还有一个主要缺点:这不允许双向绑定,因为这需要一个路径!

是否有可能为允许双向绑定的整个对象设置一个 DataGrid

重要:这是一个非常简单的模型。我知道我可以列出点数。

public class Trajectory
{
    public List<Point> points { get; set; }
}

然后将该列表绑定到 DataGrid。 但这在我的应用程序中是不可能的!

所以问题是:如何将两个列表绑定到 DataGrid?

【问题讨论】:

  • 创建一个Radius 类并列出这些类。
  • @SLaks:请在底部查看我的编辑。
  • @Rico-E,最简单的方法是创建一些 RadiiPhis 视图模型来存储两个属性,合并两个列表并绑定它。然后在需要单独的值时将其拆分。
  • @dkozl:这几乎与List&lt;Point&gt;...
  • @Rico-E,问题是Point 是一个结构(值类型),所以当 WPF 从绑定创建项目时,它将复制整个结构而不是仅引用,所以当您更改 @987654332 @它将更改副本,而不是您列表中的Point。无法进行双向绑定

标签: c# wpf binding datagrid


【解决方案1】:
DataTable DT = new DataTable();
DT.Columns.Add ("Radii");
DT.Columns.Add ("Phis");

if (Radii.Count == Phis.Count ) {
    for (int i = 0; i < Radii.Count; i++ ) {
         DT.Columns.Rows.Add(new String[] {Radii[i].ToString(), Phis[i].ToString()})
    }
}

DataGrid DG = new DataGrid();
DG.ItemsSource = DT.DefaultView;

第二个问题:

 DataRow row = (DataRow)DG.ItemContainerGenerator.Items[i];
 var V1 = row.Column["Radii"]
 var V2 = row.Column["Phis"]
 // Store them in a new object
 // if you wanna compare data use a loop or Linq

【讨论】:

  • 谢谢!这适用于显示信息。但是双向绑定呢?如何才能编辑 Grid 中的数据并在我的 trajectory 变量中查看这些更改?
  • 为此,获取表的行数,使用 DataRow 类型读取每一行,然后每个 DataRow 中有两个元素,您可以将它们存储在一个新对象中,完成后,使用 Linq 或简单的 foeach 循环与原始对象进行比较。
  • Ahmm... 你能给我一个简短的代码示例吗?因为我没有看到绑定发生在哪里......
  • 这就是我会做的,因为在我看来这是最简单的方法。有些人可能想采用更高级的方法,对于单个问题的解决方案不止于此。但这仍然有效:)
  • 但是我现在什么时候,有人更改了 Grid 中的数据?我应该只为DataGridCellEditEnding-event 添加一个处理程序,还是有更优雅的方式?
猜你喜欢
  • 1970-01-01
  • 2015-01-16
  • 2012-05-25
  • 2019-04-01
  • 1970-01-01
  • 2013-08-06
  • 2014-08-13
  • 2012-01-18
  • 1970-01-01
相关资源
最近更新 更多