如何将Datagrid的标头绑定到视图模型中的值?

sai*_*165 2 c# wpf xaml datagrid mvvm

我正在尝试将视图模型中的字符串绑定到DataGrid的标头。以下是我的.xaml代码:

<DataGrid Grid.Row="0" Grid.Column="1" Style="{StaticResource CustomDataGridStyle}" ItemsSource="{Binding InputDataCollection}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="{Binding InputNameHeader}" Binding="{Binding Name}" Width="50*"
                                ElementStyle="{StaticResource CellTextStyleR}" HeaderStyle="{StaticResource HeaderRight}"/>
            <DataGridTextColumn Header="{Binding InputStateHeader}" Binding="{Binding State}" Width="50*"
                                ElementStyle="{StaticResource CellTextStyleL}"/>
        </DataGrid.Columns>
    </DataGrid>
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是列标题始终为空。我认为这是因为我定义了ItemSource,并且将标头绑定到的东西不是那个ItemSource的一部分。

在这种情况下,没有人对我如何使用ViewModel中的字符串定义Headers有任何建议吗?

sai*_*165 8

弄清楚了。

我必须将Header绑定移动到DataGridTextColumn.HeaderTemplate并使用RelativeSource。现在它可以正常工作了。

<DataGrid Grid.Row="0" Grid.Column="1" Style="{StaticResource CustomDataGridStyle}" ItemsSource="{Binding InputDataCollection}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Name}" Width="50*" ElementStyle="{StaticResource CellTextStyleR}" HeaderStyle="{StaticResource HeaderRight}">
                <DataGridTextColumn.HeaderTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding DataContext.InputNameHeader, RelativeSource={RelativeSource AncestorType=DataGrid}}"/>
                    </DataTemplate>
                </DataGridTextColumn.HeaderTemplate>
            </DataGridTextColumn>
            <DataGridTextColumn Header="Input State" Binding="{Binding State}" Width="50*" ElementStyle="{StaticResource CellTextStyleL}">
                <DataGridTextColumn.HeaderTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding DataContext.InputStateHeader, RelativeSource={RelativeSource AncestorType=DataGrid}}"/>
                    </DataTemplate>
                </DataGridTextColumn.HeaderTemplate>
            </DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>
Run Code Online (Sandbox Code Playgroud)