Extensiones de marcado en XAML

abril 30, 2009 12:13 by marcossanchez

Una extensión de marcado se puede utilizar para proporcionar un valor a un atributo. La extensión de marcado se identifica mediante llaves ({  }). El token de cadena que sigue inmediatamente a la llave de apertura identifica el tipo de extensión de marcado.

Las extensiones de marcado más comunes utilizadas en la programación de WPF son:

StaticResource proporciona un valor para una propiedad XAML sustituyendo el valor de un recurso ya definido. StaticResource no permite referencias adelantadas, es decir, la definicion de la referencia debe estar declarada ANTES de su utilización dentro del archivo XAML.

DynamicResource proporciona un valor para una propiedad XAML aplazando ese valor para que sea una referencia a un recurso en tiempo de ejecución. Una referencia de recurso dinámica fuerza una nueva búsqueda cada vez que se tiene acceso a este tipo de recurso.

Binding proporciona un valor enlazado a datos para una propiedad, según el contexto de datos que se aplique al elemento. Esta extensión de marcado es relativamente compleja, porque habilita una sintaxis fundamentalmente incluida en el propio código para especificar un enlace de datos.

RelativeSource proporciona información de origen para un objeto Binding que puede navegar por varias posibles relaciones en el árbol de elementos en tiempo de ejecución.

TemplateBinding permite que una plantilla de control utilice valores para propiedades con plantilla procedentes de propiedades definidas por el modelo de objetos de la clase que utilizará la plantilla.

Ejemplo de utilización:

<!-- DataTemplate para elementos de tipo VTablaValidacion de un comboBox -->

<DataTemplate :Key="ComboBoxSelectorDataTemplate">
<StackPanel Height="20" Width="Auto" Orientation="Horizontal">
<TextBlock Margin="3,0,0,0" x:Name="textIndice" Text="{Binding Path=Indice}" Foreground="{DynamicResource Brush5}" TextWrapping="Wrap" FontSize="14" Width="30" HorizontalAlignment="Left"/>
<TextBlock x:Name="textNombre" Text="{Binding Path=Nombre}" TextWrapping="Wrap" FontSize="14" HorizontalAlignment="Right" Margin="10,0,0,0"/>
</StackPanel>
<DataTemplate.Triggers>

<!-- Con este Trigger se consigue que el color de fuente de los elementos de tipo ComboBoxItem cambie cuando el elemento está seleccionado-->

<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ComboBoxItem}}, Path=IsSelected}" Value="True">
<Setter Property="Foreground" Value="{DynamicResource Brush1}" TargetName="textIndice" />
<Setter Property="Foreground" Value="White" TargetName="textNombre" />
</DataTrigger>

<!-- Igual que el anterior pero cuando el ratón está encima del elemento (el elemento aún no está seleccionado...)-->

<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ComboBoxItem}}, Path=IsMouseOver}" Value="True">

<Setter Property="Foreground" Value="{DynamicResource Brush1}" TargetName="textIndice" />
<Setter Property="Foreground" Value="White" TargetName="textNombre" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>

Las extensiones que hacen referencia a brochas o colores están en este caso definidas como DynamicResource debido a que su definición se encuentra en un diccionario de recursos diferente. En general, en cuanto a rendimiento es mejor utilizar la extensión de marcado StaticResource, ya que se resuelve en tiempo de compilación, mientras que DynamicResource lo hace en tiempo de ejecución, y tantas veces como sea utilizado.


Sea el primero en calificar este post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5