为什么 `<StaticResource ResourceKey="{x:Static ... }" />` 在 DataTemplate 中不起作用?

问题描述 投票:0回答:1

我在 WPF 中遇到了一个奇怪的边缘情况,即允许嵌套元素与属性。我有一个基本的 WPF 应用程序、一个窗口和一个默认的

App.xaml

MainWindow
类在后面的代码中定义了一个键:

public const string IntKey = nameof(IntKey);

和 XAML 像这样:

<Window x:Class="StaticResourceTest.MainWindow"
    ...namespaces etc...>
    <Window.Resources>
        <system:Int32 x:Key="{x:Static local:MainWindow.IntKey}">1234</system:Int32>

        <DataTemplate DataType="{x:Type system:String}">
            <ContentControl Content="{StaticResource {x:Static local:MainWindow.IntKey}}" />
        </DataTemplate>
    </Window.Resources>

    <ContentControl Content="test" />
</Window>

这有效 - 窗口内容尝试显示一个字符串,DataTemplate 资源拦截它并显示另一个显示 int 的 ContentControl

1234

如果我将

Content
中的
DataTemplate
属性转换为嵌套元素,则会出现异常:

        <DataTemplate DataType="{x:Type system:String}">
            <ContentControl>
                <ContentControl.Content>
                    <StaticResource ResourceKey="{x:Static local:MainWindow.IntKey}" />
                </ContentControl.Content>
            </ContentControl>
        </DataTemplate>

找不到名为“System.Windows.Markup.StaticExtension”的资源。资源名称区分大小写。

如果我也转换

ResourceKey
属性:

        <DataTemplate DataType="{x:Type system:String}">
            <ContentControl>
                <ContentControl.Content>
                    <StaticResource>
                        <StaticResource.ResourceKey>
                            <x:Static Member="local:MainWindow.IntKey" />
                        </StaticResource.ResourceKey>
                    </StaticResource>
                </ContentControl.Content>
            </ContentControl>
        </DataTemplate>

它再次工作,返回到在窗口中显示

1234

注释

  • 使用键控
    DataTemplate
    而不是隐式键控,效果相同
  • 仅当
    ContentControl
    位于
    DataTemplate
    内时才会出现此错误 - 如果我将其直接放入窗口主体中,则它在所有三种情况下都有效。

问题

为什么第一次更改会导致异常?为什么第二个让它再次消失?在我看来它们应该都是等价的。

c# wpf xaml
1个回答
0
投票

可以使用 DynamicResource 而不是 StaticResource 来修复失败的代码。

<DataTemplate DataType="{x:Type system:String}">
                <ContentControl>
                    <ContentControl.Content>
                        <DynamicResource ResourceKey="{x:Static local:MainWindow.IntKey}" />
                    </ContentControl.Content>
                </ContentControl>
            </DataTemplate>
© www.soinside.com 2019 - 2024. All rights reserved.