DataGrid列标题绑定到String或Collection列表

时间:2014-06-20 20:48:41

标签: c# wpf xaml mvvm datagrid

我是WPF的新手。我正在使用MVVM开发应用程序。我需要构建一个datagrid,其中列标题应该绑定到List或集合。并且列数应该等于列表中元素的数量,其中各个标题为List元素。

我从MSDN获得此示例代码。

http://code.msdn.microsoft.com/Binding-of-DataGrid-column-73f80f68/sourcecode?fileId=74132&pathId=179795492

MainWindow.xaml

<Grid>
    <DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.Header>
                    <TextBlock Text="{Binding DataContext.HeaderNameText, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" />
                </DataGridTemplateColumn.Header>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock Text="{Binding}" />
                        </StackPanel>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

MainWindow.xaml.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        Data data = new Data();
        data.HeaderNameText = "Header2";
        data.Items = new List<string>() { "Item1", "Item2" };

        this.DataContext = data;
    }
}

这里HeaderNameText是一个字符串,我需要它作为List来生成Column,每个Header作为列表的元素。

我搜索得很多,找不到任何有用的东西

1 个答案:

答案 0 :(得分:0)

您应该使用DataGridColumn.HeaderTemplate Property,而不是使用DataGridColumn.Header属性。尝试这样的事情:

<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTemplateColumn>
            <DataGridColumn.HeaderTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition />
                        </Grid.RowDefinitions>
                        <TextBlock Text="{Binding DataContext.HeaderNameText, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
                        <ListBox ItemsSource="{Binding DataContext.Items, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
                    </Grid>
                </DataTemplate>
            </DataGridColumn.HeaderTemplate>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding}" />
                    </StackPanel>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

我不确定这是否会实现你想要的,因为Items集合中的项目数会影响DataGrid所拥有的行数和列数。