WPF中如何复用定义为资源的DataGrid列至不同标签页的DataGrid?
WPF中复用DataGrid列资源的方法
要在多标签页的多个DataGrid中复用已定义为资源的列,直接在DataGrid.Columns集合里用StaticResource标签引用对应资源即可,多列依次添加引用就行。
完整示例代码
先保留你已定义的列资源(放在TabControl的Resources中),还可添加更多列资源:
<TabControl.Resources> <DataGridTextColumn x:Key="NameGridColumn" Binding="{Binding Name}" IsReadOnly="True" Width="*"> <DataGridTextColumn.Header> <StackPanel Orientation="Horizontal"> <TextBlock Text="Name" VerticalAlignment="Center"/> <Button Command="{Binding SortByNameCommand}" Content="▲" Background="Transparent" BorderThickness="0" Margin="5 0 0 0"/> </StackPanel> </DataGridTextColumn.Header> </DataGridTextColumn> <!-- 示例:新增年龄列资源 --> <DataGridTextColumn x:Key="AgeGridColumn" Binding="{Binding Age}" IsReadOnly="True" Width="100"/> </TabControl.Resources>
接着在每个TabItem的DataGrid中引用这些列:
<TabItem Header="Tab 1"> <DataGrid ItemsSource="{Binding ItemsCollection}" CanUserAddRows="False" CanUserDeleteRows="False" CanUserSortColumns="False" AutoGenerateColumns="False"> <DataGrid.Columns> <!-- 引用姓名列资源 --> <StaticResource ResourceKey="NameGridColumn"/> <!-- 引用年龄列资源 --> <StaticResource ResourceKey="AgeGridColumn"/> <!-- 有更多列的话,继续添加对应的StaticResource引用 --> </DataGrid.Columns> </DataGrid> </TabItem> <TabItem Header="Tab 2"> <DataGrid ItemsSource="{Binding AnotherItemsCollection}" CanUserAddRows="False" CanUserDeleteRows="False" CanUserSortColumns="False" AutoGenerateColumns="False"> <DataGrid.Columns> <StaticResource ResourceKey="NameGridColumn"/> <StaticResource ResourceKey="AgeGridColumn"/> </DataGrid.Columns> </DataGrid> </TabItem>
注意事项
- 由于
DataGridColumn不在可视化树中,若列内的绑定(比如排序命令SortByNameCommand)需要匹配每个DataGrid对应的ViewModel上下文,需调整绑定方式,通过RelativeSource指定绑定源:<Button Command="{Binding DataContext.SortByNameCommand, RelativeSource={RelativeSource AncestorType=DataGrid}}" Content="▲" Background="Transparent" BorderThickness="0" Margin="5 0 0 0"/> - 若需要动态同步列资源的修改(比如修改列宽后自动更新所有引用的DataGrid),可把
StaticResource替换为DynamicResource。
内容的提问来源于stack exchange,提问作者Daniel Müller
相关产品推荐
相关产品推荐

