【问题标题】:WPF StringFormat databinding text not appearingWPF StringFormat 数据绑定文本未出现
【发布时间】:2023-03-20 23:11:01
【问题描述】:

我试图在绑定到 XML 源时设置 TreeviewItem 的标题文本。一切正常,除了标题中出现的唯一内容是我要绑定的文本,而字符串格式中没有其他内容。示例:

<HierarchicalDataTemplate x:Key="LogDataTemp" ItemsSource="{Binding Path=log}">
    <TreeViewItem>
        <TreeViewItem.Header>
            <Binding Path="Attribute[level].Value" StringFormat="TEST \{0\}" />
        </TreeViewItem.Header>
    </TreeViewItem>
</HierarchicalDataTemplate>

在这种情况下,会显示级别值,但没有其他内容。我已经尝试了几十种不同的方法来解决这个问题,但似乎没有任何效果。

【问题讨论】:

    标签: wpf binding


    【解决方案1】:

    不要转义 StringFormat 中的大括号。您想将格式应用于绑定中的第 0 个元素。

    例如,使用一个名为“Level”的简单属性:

            <TextBlock x:Name="txtUnformatted" Grid.Row="0" Foreground="White" >
                <TextBlock.Text>
                    <Binding Path="Level" />
                </TextBlock.Text>
            </TextBlock>
    
            <TextBlock x:Name="txtFormatted" Grid.Row="1" Foreground="White">
                <TextBlock.Text>
                    <Binding Path="Level" StringFormat="Test {0:000000}" />
                </TextBlock.Text>
            </TextBlock>
    

    结果类似于:

    更新

    此外,当您不添加任何控件时,Header 的默认实现是一个简单的 ContentPresenter,它不应用格式。要解决此问题,只需将 TextBlock 放入标题中,然后将要格式化的文本绑定到该标题。

    <HierarchicalDataTemplate x:Key="LogDataTemp" ItemsSource="{Binding Path=log}">
        <TreeViewItem>
            <TreeViewItem.Header>
                <TextBlock>
                    <TextBlock.Text>
                         <Binding Path="Attribute[level].Value" 
                                  StringFormat="TEST {0}" />
                    </TextBlock.Text>
                </TextBlock>
            </TreeViewItem.Header>
        </TreeViewItem>
    </HierarchicalDataTemplate>
    

    将控件放入标题控件(例如,包含图像和标签的网格)是完全可以接受的(并且通常这样做)。 WPF 之美。

    【讨论】:

    • 我最初的想法也是,但它没有解释为什么出现绑定值而不是字符串文字“TEST {0}”...
    • 我也试过不转义。仅出现绑定值。我刚刚尝试将其更改为您建议的格式“{0:000000}”,但仍然只显示绑定值而不是“测试”。
    • 我想知道它是否与您发布的内容作为标题而不是文本块有关。
    • 确定我在 TreeviewItem 中添加了一个文本块并使用了相同的字符串格式,并且测试在那里看起来很好。有什么想法吗?
    • 这是因为 Header 的内部表示,当您不使用控件时,是一个简单的 ContentPresenter,它不应用任何格式。如果您只是在标题中放置一个 TextBlock,它将使用它来显示内容,并且如您所见,您可以对其进行格式化。在 Header 中放置控件当然没有错,并且是常见的做法(例如,放置包含图标和文本块的网格)。我将更新我的答案以反映这一点。
    猜你喜欢
    • 2011-08-17
    • 2011-03-11
    • 2010-12-29
    • 1970-01-01
    • 2017-02-16
    • 2011-05-28
    • 2013-03-12
    • 1970-01-01
    • 2011-03-26
    相关资源
    最近更新 更多