Infragistics XamDataGrid具有可变数量的列

时间:2011-04-25 23:40:17

标签: wpf data-binding infragistics xamdatagrid

我需要能够支持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达到我想要的效果。有没有人有我想要的例子?我是否可以在运行时以编程方式创建所有列?

3 个答案:

答案 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)

我在另一篇文章中回答了这个问题

Adding variable no of columns

我在其中创建了一个行为,并根据某些条件添加了列(在我的情况下,字段布局没有)。你可以检查数据源,然后再做同样的事情。

你必须在某处定义一些列,然后检索它们,以便根据数据source.ex为你的XamDataGrid创建一个FieldLayout。

        XamDataGrid xamDataGrid;
        if (DataSource.GetType() == typeof(X))
        {
            AddFieldLayout1(xamDataGrid);
        }
        else if (DataSource.GetType() == typeof(Y))
        {
            AddFieldLayout2(xamDataGrid);
        }

AddFieldLayout 方法中,将字段添加到网格布局中。