Pregunta

Parece que no puedo encontrar la combinación mágica para hacer que HeaderStringFormat funcione para un WPF Expander.

Aquí están todas las cosas que he probado:

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

La única forma en que puedo hacer que una cadena formateada funcione correctamente en mi código es hacer esto:

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

¿Qué estoy haciendo mal?

¿Fue útil?

Solución

Lo primero a tener en cuenta es esto:

  

Si configura el HeaderTemplate o   Propiedad HeaderTemplateSelector de un   HeaderedContentControl, el   La propiedad HeaderStringFormat es   ignorado    MSDN

Hay muchas trampas como esta en WPF a tener en cuenta. No mostraste eso en tu ejemplo, pero solo tenlo en cuenta. Sin embargo, no creo que este sea tu problema.

La segunda cosa a tener en cuenta es que esto no es lo mismo que:

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

HeaderedContentControl y HeaderStringFormat se usan específicamente para las clases que implementan IFormattable. HederStringFormat formatea el encabezado y ContentStringFormat formatea el contenido. El valor de cualquiera de las propiedades es el formato que se pasa a la implementación de sus clases si IFormattable.ToString. Puede leer el ejemplo completo en MSDN . Pero aquí está la esencia de cómo hacer que funcione.

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>

Este TabItem ahora mostrará " Esta es mi cadena formateada " en el encabezado, y el contenido será " esta es mi cadena sin formato " ;.

Hay un par de cosas a tener en cuenta. Por lo general, estas propiedades solo se usarían en un contexto HeaderedItemsControl. HeaderStringFormat no se vincularía de esta manera y, en cambio, tendrá el enlace predeterminado proporcionado por ItemContainer de HeaderedItemsControl. Por ejemplo, si configura la propiedad ItemsSource del TabItem, automáticamente conectará el encabezado y el enlace de contenido por usted, y todo lo que tiene que hacer es proporcionar el valor de formato que desee.

Por último, pero no menos importante, pude hacer que todo funcionara correctamente con GroupBox y TabItem, pero no tuve mucha suerte con un expansor y no estoy seguro de por qué. El expansor maneja el ContentStringFormat correctamente, pero no el HeaderContentStringFormat. Esto es sorprendente teniendo en cuenta que ambos heredan de HeaderContentControl.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top