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には、このような注意すべき落とし穴がかなりあります。あなたの例ではそれを示していませんが、それを覚えておいてください。しかし、これはあなたの問題ではないと思います。

2つ目の注意点は、これは次のものと同じではないということです。

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 に答える