Ejemplos avanzados de Binding

mayo 15, 2009 13:54 by marcossanchez

La extensión de marcado Binding en XAML es muy configurable, de forma que podemos usarlo de multitud de maneras para conseguir enlazar una propiedad de un control con cualquier otro elemento o propiedad que queramos. A continuación veremos algunos ejemplos:

Enlace entre controles:

      A) Directamente:

<Slider x:Name="slider" Minimum="0" Maximum="300" Value="50" />
<Rectangle Width="{Binding Path=Value, ElementName=slider}" Height="100" Fill="Red" />

 

     B) Buscando a través del árbol visual del elemento:

Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ComboBoxItem}}, Path=IsSelected}"

Utilizando Converters:

Height="{Binding ElementName=txtCategoria1, Path=Text, Converter={StaticResource StringToHeight}} 

Con el Converter StringToHeight podemos convertir una cadena de caracteres en un entero que se aplicará a la propiedad Height del control. La regla de conversión la define el programador.

Enlace a un elemento de una colección:

<TextBlock Text="{Binding Path=Collection[index].PropertyName}"/>

 

Un ejemplo final que combina alguno de los anteriores. Se usa para asignar la propiedad Tooltip de un elemento (por ejemplo un TextBox) cuando la validación del elemento falla:

<Trigger Property="Validation.HasError" Value="True">
    <Setter Property="ToolTip" Value="{Binding Path=(Validation.Errors)[0].ErrorContent, RelativeSource={x:Static RelativeSource.Self}}" />
</Trigger>


Sea el primero en calificar este post

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

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