我有一个简单的一维数组:
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
控件,但我有两个问题:
DataGrid
填充了正确的数据,但是以一种奇怪的方式。我得到一个3x3网格,第一行全部为'4',第二行全部为'5',第三行全部为'6'。双向绑定需要Path或XPath
我想我可以制作三个独立的DataGrid
控件,但我认为这会更优雅。
答案 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
中的多行。