Pregunta

La siguiente código de ejemplo Microsoft contiene lo siguiente:

<Grid>
...     
  <Border Name="Content" ... >
...     
  </Border>
</Grid>
<ControlTemplate.Triggers>
  <Trigger Property="IsExpanded" Value="True">
     <Setter TargetName="ContentRow" Property="Height"
             Value="{Binding ElementName=Content,Path=DesiredHeight}" />
  </Trigger>
...
</ControlTemplate.Triggers>

Cuando se ejecuta, sin embargo, este código genera el siguiente error de enlace de datos:

System.Windows.Data Error: 39 : BindingExpression path error: 'DesiredHeight' property not found on 'object' ''Border' (Name='Content')'. BindingExpression:Path=DesiredHeight; DataItem='Border' (Name='Content'); target element is 'RowDefinition' (HashCode=2034711); target property is 'Height' (type 'GridLength')

A pesar de este error, el código funciona correctamente. He mirado a través de la documentación y DesiredHeight no parece ser un miembro de Border. ¿Alguien puede explicar de dónde proviene de DesiredHeight? Además, ¿hay alguna manera de resolver / eliminar este error por lo que mi salida del programa es limpio?

¿Fue útil?

Solución

Se puede ver que la propiedad en la parte de código de la aplicación

Editar:

Border content = new Border();
int desiredHeight = content.DesiredSize.Height;
int desiredWidth = content.DesiredSize.Width;

Para resolver el problema probarlo unión con el atributo de altura, ya que DesiredHeight no parece estar disponible en el marcado XAML del control de fronteras.

Otros consejos

He encontré con esto. A lo largo de las líneas de lo user275587 dijo, su ejemplo funciona porque el gatillo elimina la Altura = "0" en el RowDefination.

Así que me cambio la lógica de ajuste de altura / de disparo, por lo que el RowDefination no tiene Altura set

<Grid.RowDefinitions>
     <RowDefinition Height="Auto"/>
     <RowDefinition Name="ContentRow" />
</Grid.RowDefinitions>
...
<ControlTemplate.Triggers>
     <Trigger Property="IsExpanded" Value="False">
             <Setter TargetName="ContentRow" Property="Height" Value="0" />
     </Trigger>
</ControlTemplate.Triggers>

Trate de ella.

<Setter
    TargetName="content"
    Property="Height"
    Value="{Binding ElementName=content, Path=DesiredHeight}"
/>
    ↓
<Setter TargetName="content" Property="Height" Value="NaN"/>

La unión es innecesaria.

Se me ocurrió sobre la misma cuestión en mi solicitud. Al final he cambiado el código para que I toggled la visibilidad del contenido entre Collapsed y Visible, y se sustituye la Grid con un StackPanel.

He encontrado en general la calidad de las muestras de control plantilla MS a ser bastante buena, pero el error con éste era un poco frustrante.

El mismo problema, pero la solución aceptada por Carlo no funciona perfectamente. El problema que se enfrenta el cartel desaparece pero el expansor rompe parcialmente -

si tiene algún contenido que necesita para expandir en un expansor ya ampliado, no va a hacerlo con la unión a DesiredSize.Height , es necesario DesiredHeight - podría deberse a una razón dada por user275587.

tenían el mismo problema. Estaba usando un Expander personalizado en un ComboBox personalizado. Ninguna de las anteriores trabajó para mí, la unión a Height rompió la funcionalidad del Expander, utilizando un StackPanel también rompió la visualización de los elementos de cada grupo. He encontrado:

<Setter TargetName="ContentRow" Property="Height" Value="Auto"/>

DesiredHeight viene del elemento de contenido y se trata de una unión válida. Creo que la razón de su unión no se resuelve es porque DesiredHeight se basa en la propiedad de altura y no se ha establecido una altura fija en su plantilla por lo que se evalúa como Double.NaN

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