【问题标题】:WPF Dynamic DataGrid headersWPF 动态 DataGrid 标头
【发布时间】:2018-03-05 11:37:11
【问题描述】:

由于不可能让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>

字符串资源位于某个单独的文件中,当我将它换成具有相同键但使用其他语言的文本的其他文件时,标题会更改。

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

如果我打开第二个选项卡时没有标题,但它们第一次显示在两个选项卡上,然后当我打开一个选项卡(这是第一个打开)第二次。

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

【问题讨论】:

    标签: c# wpf xaml resourcedictionary


    【解决方案1】:

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

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

    【讨论】:

    • 这么简单,太棒了!
    • 现在将其应用于我的 700 多个资源 xD。轻松查找并替换遗嘱。
    • 你知道为什么这个属性在 Intellisense 中不可见吗?
    • @Adder,是的,似乎有 no other means 来设置它,所以祝你好运替换 :P 至于可见性,关于 x:Shared 的文章指出它严格仅限 WPF。它不在 XAML 规范中,所以我想这就是原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 2011-03-05
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    相关资源
    最近更新 更多