En el desarrollo con WPF, el enlace de datos requiere el uso de propiedadse en lugar de campos. Si se emplean campos, la inetrfaz no se actualizará y no se generará ninguna excepción. Para que las propiedades puedan notificar al enlace cuando cambian, la clase debe implementar la interfaz INotifyPropertyChanged.
Ejemplo 1: Asignación del DataContext
En este ejemplo, el DataContext de la ventana se establece como la propia isntancia de la clase de ventana. La propiedad enlazada notifica los cambios mediante el evento PropertyChanged.
<Window x:Class="AppDemo.WindowPrincipal"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Ejemplo de Enlace" Height="300" Width="400">
<StackPanel>
<TextBox x:Name="campoTexto" Text="{Binding Valor}"/>
<Button x:Name="botonActualizar" Click="ActualizarValor_Click" Content="Actualizar"/>
</StackPanel>
</Window>
using System.ComponentModel;
using System.Windows;
namespace AppDemo
{
public partial class WindowPrincipal : Window, INotifyPropertyChanged
{
private string _valor = "Texto inicial";
public string Valor
{
get => _valor;
set
{
_valor = value;
OnPropertyChanged(nameof(Valor));
}
}
public event PropertyChangedEventHandler PropertyChanged;
public WindowPrincipal()
{
InitializeComponent();
DataContext = this;
}
protected void OnPropertyChanged(string nombrePropiedad)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nombrePropiedad));
}
private void ActualizarValor_Click(object sender, RoutedEventArgs e)
{
Valor += " modificado";
}
}
}
Mecanismo de uso del DataContext
- En el código subyacente, se asigna el DataContext a la instancia actual: ```
DataContext = this;
- En XAML, se puede definir el DataContext usando StaticResource con un objeto de modelo.
Ejemplo 2: Enlace mediante StaticResource
Se define un recurso estático para un modelo de datos (por ejemplo, una clase Alumno) y se establece como DataContext de un panel en XAML.
<Window x:Class="AppDemo.WindowPrincipal"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:AppDemo"
Title="Enlace con Recursos" Height="300" Width="400">
<Window.Resources>
<local:Alumno x:Key="recursoAlumno" Identificador="1" NombreCompleto="Ana López" Edad="22"/>
</Window.Resources>
<StackPanel DataContext="{StaticResource recursoAlumno}">
<TextBox Text="{Binding NombreCompleto}"/>
<Button Click="CambiarNombre_Click" Content="Cambiar Nombre"/>
</StackPanel>
</Window>
using System.ComponentModel;
using System.Windows;
namespace AppDemo
{
public partial class WindowPrincipal : Window
{
public WindowPrincipal()
{
InitializeComponent();
}
private void CambiarNombre_Click(object sender, RoutedEventArgs e)
{
if (Resources["recursoAlumno"] is Alumno alumno)
{
alumno.NombreCompleto += " modificado";
}
}
}
public class Alumno : INotifyPropertyChanged
{
public int Identificador { get; set; }
private string _nombreCompleto;
public string NombreCompleto
{
get => _nombreCompleto;
set
{
_nombreCompleto = value;
OnPropertyChanged(nameof(NombreCompleto));
}
}
public int Edad { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string nombrePropiedad)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nombrePropiedad));
}
}
}
En ambos ejemplos, la implementación de INotifyPropertyChanged asegura que la interfaz gráfica se actualice automáticamente cuando la propiedad enlazada cambia su valor. El enlace de datos en XAML se establece mediante la sintaxis {Binding NombrePropiedad}, donde NombrePropiedad debe coincidir con el nombre de la propiedad pública en el objeto asignado al DataContext.