2008-11-16 19 views
11

Nie mogę znaleźć tej magicznej kombinacji, która sprawiłaby, że narzędzie HeaderStringFormat działa w ekspanderze WPF.WPF - HeaderStringFormat nie działa w programie Expander

Oto wszystko, co próbowałem:

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

Jedyny sposób mogę uzyskać sformatowany ciąg pracować prawidłowo w moim kodu jest, aby to zrobić:

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

Co am Robię źle?

Odpowiedz

10

Pierwszą rzeczą, aby pamiętać, to:

Jeśli ustawisz HeaderTemplate lub własność HeaderTemplateSelector o HeaderedContentControl właściwość HeaderStringFormat jest ignorowane. MSDN

Istnieje sporo pułapek, jak to w WPF na które trzeba uważać. Nie pokazałeś tego na swoim przykładzie, ale miej to na uwadze. Jednak nie sądzę, że to twój problem.

Drugą rzeczą jest, aby pamiętać, że to nie jest takie samo jak:

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

HeaderedContentControl i HeaderStringFormat stosowane są specjalnie dla klas, które implementują IFormattable. HederStringFormat formatuje nagłówek, a ContentStringFormat formatuje treść. Wartością każdej z właściwości jest format przekazywany do implementacji klas, jeśli IFormattable.ToString. Pełny przykład można przeczytać na stronie MSDN. Ale oto, jak sprawić, by działało.

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> 

Ten TabItem będzie teraz wyświetlać „To jest moje sformatowany ciąg” w nagłówku, a zawartość będzie „to mój non-sformatowany ciąg”.

Jest kilka rzeczy, o których należy pamiętać. Zazwyczaj te właściwości będą używane tylko w kontekście HeaderedItemsControl. HeaderStringFormat nie byłby związany w ten sposób, a zamiast tego będzie miał domyślne powiązanie dostarczone przez ItemContainer z HeaderedItemsControl. Na przykład, jeśli ustawisz właściwość ItemsSource elementu TabItem, to automatycznie połączy on nagłówek i powiązanie zawartości, a wszystko, co musisz zrobić, to podać żądaną wartość formatowania.

Ostatni, ale nie mniej ważny, udało mi się uzyskać wszystko działa poprawnie z GroupBox i TabItem, ale nie tak dużo szczęścia z ekspanderem i nie jestem pewien dlaczego. Ekspander obsługuje poprawnie ContentStringFormat, ale nie HeaderContentStringFormat. Jest to zaskakujące, biorąc pod uwagę, że oba dziedziczą z HeaderContentControl.

Powiązane problemy