2008-11-16 5 views
11

Я не могу найти магическую комбинацию, чтобы заставить HeaderStringFormat работать с WPF Expander.WPF - HeaderStringFormat Не работает в 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> 

Что утра Я делаю неправильно?

ответ

10

Первое, что нужно отметить, это:

Если вы установите HeaderTemplate или HeaderTemplateSelector свойство HeaderedContentControl свойство 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 не будет связан таким образом и вместо этого будет иметь привязку по умолчанию, предоставленную ItemContainer HeaderedItemsControl. Например, если вы установите свойство ItemsSource для TabItem, он автоматически подключит заголовок и привязку содержимого для вас, и все, что вам нужно сделать, это предоставить нужное значение форматирования.

Последнее, но не менее важное: я смог получить все, что работает нормально с GroupBox и TabItem, но не так много удачи с расширителем, и я не уверен, почему. Расширитель правильно обрабатывает ContentStringFormat, но не HeaderContentStringFormat. Это удивительно, учитывая, что оба наследуются от HeaderContentControl.