将WPF DataGrid绑定到一维数组

时间:2018-04-12 21:16:40

标签: c# arrays wpf binding datagrid

我有一个简单的一维数组:

class Cylinder {
    private float[] vector = new float[3] {4,5,6};
    public float[] Vector = { get; set; }
}

在我的XAML中,我创建了一个带有一些简单绑定的DataGrid

<Grid x:Name="MyGrid>
    <DataGrid ItemsSource="{Binding Vector, Mode=TwoWay}">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Path=.}"/>
            <DataGridTextColumn Binding="{Binding Path=.}"/>
            <DataGridTextColumn Binding="{Binding Path=.}"/>
        </DataGrid.Columns>
    </DataGrid>
<Grid>

然后我将DataContext的{​​{1}}设置为MyGrid类的实例。窗口显示Cylinder控件,但我有两个问题:

  1. DataGrid填充了正确的数据,但是以一种奇怪的方式。我得到一个3x3网格,第一行全部为'4',第二行全部为'5',第三行全部为'6'。
  2. 当我尝试编辑9个单元格中的任何一个时,我得到一个例外:
  3.   

    双向绑定需要Path或XPath

    我想我可以制作三个独立的DataGrid控件,但我认为这会更优雅。

1 个答案:

答案 0 :(得分:0)

你有一维数组,那么你期望它如何绑定到3列?想想看,DataGrid就像是二维数组的显示,列是x轴,行是y轴。所以你的一维数组必须放在一列的行中。

编辑要表示您在评论中提到的更复杂的类型,如果将DataTable直接绑定到数据,则可以使用DataGrid(仅用于非常简单)如果绑定到业务对象,则更好List<>。这是一个例子:

将您的类更改为具有您想要的三个属性(为它们提供比此示例更有意义的名称):

public class Cylinder {
    public float Vector1 = { get; set; };
    public float Vector2 = { get; set; };
    public float Vector3 = { get; set; };
}

现在您可以将DataGrid直接绑定到此类进行测试,但在实际应用程序中,数据来自某些来源(如数据库),您可以创建此类的列表:

var cylinders = new List<Cylinder>();

然后使用来自数据库的数据填充它:

foreach(var row in myTable) {
    var c = new Cylinder();
    c.Vector1 = 4;
    c.Vector2 = 5;
    c.Vector3 = 6;
    cylinders.Add(c);
}

现在,您可以将DataGrid绑定到cylinders。网格将有三列代表Cylinder类的三个属性,以及myTable中的多行。