12

我似乎找不到使 HeaderStringFormat 为 WPF Expander 工作的神奇组合。

这是我尝试过的所有事情:

<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>

我究竟做错了什么?

4

1 回答 1

12

首先要注意的是:

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

在 WPF 中有很多这样的陷阱需要提防。您没有在示例中显示这一点,但请记住这一点。但是,我不认为这是你的问题。

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

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

HeaderedContentControl 和 HeaderStringFormat 专门用于实现 IFormattable 的类。HederStringFormat 格式化标题,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 现在将在标题中显示“这是我的格式化字符串”,内容将是“这是我的非格式化字符串”。

有几件事要记住。通常,这些属性将仅在 HeaderedItemsControl 上下文中使用。HeaderStringFormat 不会以这种方式绑定,而是将具有 HeaderedItemsControl 的 ItemContainer 提供的默认绑定。例如,如果您设置 TabItem 的 ItemsSource 属性,那么它将自动为您连接标题和内容绑定,您所要做的就是提供您想要的格式值。

最后但并非最不重要的一点是,我能够使用 GroupBox 和 TabItem 使一切正常工作,但使用扩展器并没有那么幸运,我不知道为什么。扩展器正确处理 ContentStringFormat,但不能正确处理 HeaderContentStringFormat。考虑到两者都继承自 HeaderContentControl,这令人惊讶。

于 2008-11-17T04:10:32.343 回答