我需要能够支持XamDataGrid,它在设计时不会有一定数量的列。例如,应用程序将运行,从服务器获取一些数据并创建一些对象。根据服务器的响应,每次运行应用程序时,我可能会有不同数量的对象。
这是我的意思的一个例子。假设我打电话给某些服务并获取一些信息的xml响应。我将该响应反序列化为多个对象,每次调用时都可能不同。
让我们说每个对象都有两个属性,Label和Value。我希望网格显示带有标签的列,其中Label的值与Value的值相匹配。所以,如果我有两个对象,obj1和obj2,它们看起来像这样:
obj1.Label = "Parts"
obj1.Value = "17"
obj2.Label = "Parts"
obj2.Value = "12"
我想要一个看起来像这样的网格,有两行:
零件
17
12
如果我将数据源绑定到网格,网格会自动使用对象的属性来创建列,因此我看到了Label和Value列:
标签值
第17部分
第12部分
我假设我无法通过xaml达到我想要的效果。有没有人有我想要的例子?我是否可以在运行时以编程方式创建所有列?
答案 0 :(得分:1)
<Grid>
<DataGrid Name="dgTest" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=ItemsSource[0].Label}" />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Value}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
和代码:
public partial class Window12 : Window
{
public Window12()
{
InitializeComponent();
List<MyClass> l = new List<MyClass>();
l.Add(new MyClass
{
Label = "Parts",
Value = "17"
});
l.Add(new MyClass
{
Label = "Parts",
Value = "12"
});
dgTest.ItemsSource = l;
}
}
public class MyClass
{
public string Label { get; set; }
public string Value { get; set; }
}
答案 1 :(得分:0)
Iverzin的解决方案将适用于XamDataGrid。它具有autogenerate fields的能力,因此您不必在设计时指定它们。
答案 2 :(得分:0)
我在另一篇文章中回答了这个问题
我在其中创建了一个行为,并根据某些条件添加了列(在我的情况下,字段布局没有)。你可以检查数据源,然后再做同样的事情。
你必须在某处定义一些列,然后检索它们,以便根据数据source.ex为你的XamDataGrid创建一个FieldLayout。
XamDataGrid xamDataGrid;
if (DataSource.GetType() == typeof(X))
{
AddFieldLayout1(xamDataGrid);
}
else if (DataSource.GetType() == typeof(Y))
{
AddFieldLayout2(xamDataGrid);
}
在 AddFieldLayout 方法中,将字段添加到网格布局中。