WPF - HeaderStringFormat在Expander中无效

12

我似乎找不到让WPF Expander的HeaderStringFormat属性生效的正确方法。

以下是我尝试过的所有方法:

<Expander Header="{Binding Path=MyProperty, StringFormat=Stuff: ({0})}"  >
    <TextBlock Text="Some Content" />
</Expander>
<Expander HeaderStringFormat="{}Stuff ({0})" Header="{Binding Path=MyProperty}">
    <TextBlock Text="Some More Content" />
</Expander>
<Expander HeaderStringFormat="{}Stuff ({0:0})" Header="{Binding Path=MyProperty}">
    <TextBlock Text="Even More Content" />
</Expander>

我在代码中想要正确使用格式化的字符串只有这种方法:

<Expander>
    <Expander.Header>
        <TextBlock Text="{Binding Path=MyProperty, StringFormat=Stuff: ({0})}" />
    </Expander.Header>
    <Expander.Content>
        A Expander with working header
    </Expander.Content>
</Expander>

我做错了什么?

1个回答

12

需要注意的第一件事是:

如果您设置HeaderedContentControl的HeaderTemplate或HeaderTemplateSelector属性,则忽略HeaderStringFormat属性。 MSDN

在WPF中有许多类似于这样的问题需要注意,虽然您在示例中没有显示出来,但请记住。但我认为这不是您的问题。

需要注意的第二件事是,这与以下内容并不相同:

String.Format("My string value is: {0}", myValue");

HeaderedContentControl和HeaderStringFormat是专门用于实现IFormattable接口的类。HeaderStringFormat格式化标题,而ContentStringFormat格式化内容。任一属性的值都是传递给你的类实现的IFormattable.ToString方法的格式。您可以在MSDN上阅读完整示例。但这里是使其工作的精髓。

public class MyTestClass : IFormattable
{
    #region IFormattable Members
    public string ToString(string format, IFormatProvider formatProvider)
    {
        if(format == "n")
        {
            return "This is my formatted string";
        }
        else
        {
            return "this is my non-formatted string";
        }
    }
    #endregion
}

    <Style TargetType="{x:Type TabItem}">
        <Setter Property="HeaderStringFormat" Value="n" />
        <Setter Property="ContentStringFormat" Value="" />
    </Style>

<TabControl>
    <TabItem Header="{Binding Content, RelativeSource={RelativeSource Self}}">
        <local:MyTestClass />
    </TabItem>
</TabControl>

这个 TabItem 现在将在标题中显示 "This is my formatted string",而内容将是 "this is my non-formatted string"。

需要记住的几件事情。通常这些属性只会在 HeaderedItemsControl 上下文中使用。HeaderStringFormat 不会以这种方式绑定,而是由 HeaderedItemsControl 的 ItemContainer 提供默认绑定。例如,如果您设置 TabItem 的 ItemsSource 属性,则它将自动为您连接标题和内容绑定,您只需要提供所需格式化值即可。

最后,我能够通过 GroupBox 和 TabItem 将所有内容都正常工作,但是对于 Expander 我就没那么幸运了,不确定原因是什么。Expander 可以正确处理 ContentStringFormat,但不能处理 HeaderContentStringFormat。这很令人惊讶,因为它们都继承自 HeaderContentControl。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接