WPF动态DataGrid标头

时间:2018-03-05 11:37:12

标签: c# wpf xaml resourcedictionary

由于DataGrid标头无法动态读取某个资源文件,因此我使用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>

字符串资源在一些单独的文件中,当我只是用相同的密钥替换某些其他文件但使用其他语言的文本时,标题会被更改。

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

对我来说更有意义,如果我打开第二个标签时没有标题,但是它们第一次显示在两个标签上,然后当我打开一个标签(它是第一次打开)。

资源位于资源字典中,作为XAML个文件。

1 个答案:

答案 0 :(得分:2)

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

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