WPF 动态数据网格 headers

WPF Dynamic DataGrid headers

因为不可能 DataGrid headers 动态读取一些资源文件,所以我使用了在 SO 上找到的方法来做到这一点。它通过将 TextBlock 作为资源来工作,该资源正在动态读取其他一些 string 资源。像这样:

<DataGrid>
    <DataGrid.Columns>
        <DataGridTextColumn Header="{StaticResource dghName}"/>
        <DataGridTextColumn Header="{StaticResource dghAge}"/>
    </DataGrid.Columns>
</DataGrid>

在资源中我会有这个:

<TextBlock x:Key="dghName" Text="{DynamicResource Name}"/>
<TextBlock x:Key="dghAge" Text="{DynamicResource Age}"/>

<sys:String x:Key="Name">Name</sys:String>
<sys:String x:Key="Age">Age</sys:String>

字符串资源位于某个单独的文件中,当我将它替换为具有相同键但使用其他语言的文本的其他文件时,headers 发生了变化。

这一切都很好,直到需要在两个地方使用相同的资源。我在两个 TabItem 内有相同的 DataGrid。当我打开第一个时, headers 正常显示,然后我切换到另一个选项卡, headers 也在那里。现在,当我改回第一个 TabItem 时,headers 是空的。如果我先打开第二个选项卡,也会发生同样的事情 - 当我切换到第一个选项卡然后返回到第二个选项卡时,headers 为空。

如果我打开第二个选项卡时没有 headers 对我来说更有意义,但它们是第一次显示在两个选项卡上,然后它们就消失了,当我打开一个选项卡(这是第一个打开的)第二次。

资源在资源字典中,如 XAML 个文件。

您可以向元素添加 x:Shared="false" 属性。
这样每个数据网格都会收到它自己的资源实例,而不是试图共享同一个资源实例:

<TextBlock x:Key="dghName" Text="{DynamicResource Name}" x:Shared="false" />
<TextBlock x:Key="dghAge" Text="{DynamicResource Age}" x:Shared="false" />