Compartir a través de


Creación de un enlace de datos

En este artículo se describe cómo crear una vinculación de datos XAML. En el ejemplo se usa un objeto de datos que representa a un empleado de una empresa. Este objeto de datos está enlazado a una ventana XAML que usa TextBlock controles para enumerar los detalles del empleado. Creará una interfaz de usuario similar a la siguiente imagen:

Una ventana de WPF que muestra detalles sobre un empleado, como su nombre, apellidos, título, fecha de contratación y salario.

Para obtener más información sobre el enlace de datos, consulte Introducción al enlace de datos en WPF.

Creación de un objeto de datos

En este ejemplo, se usa un empleado como el objeto de datos al que está enlazada la interfaz de usuario.

  1. Agregue una nueva clase al proyecto y asígnele Employeeel nombre .

  2. Reemplaza todo el código por el fragmento siguiente:

    using System;
    using System.ComponentModel;
    
    namespace ArticleSample
    {
        public class Employee : INotifyPropertyChanged
        {
            private decimal _salary;
            public event PropertyChangedEventHandler? PropertyChanged;
    
            public required string FirstName { get; set; }
            public required string LastName { get; set; }
            public required string Title { get; set; }
            public required DateTime HireDate { get; set; }
    
            public required decimal Salary
            {
                get => _salary;
                set
                {
                    _salary = value;
    
                    // Support TwoWay binding
                    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Salary)));
                }
            }
        }
    }
    
    Imports System.ComponentModel
    
    Public Class Employee
        Implements INotifyPropertyChanged
    
        Private _salary As Decimal
        Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
    
        Public Property FirstName As String
        Public Property LastName As String
        Public Property Title As String
        Public Property HireDate As DateTime
    
        Public Property Salary As Decimal
            Get
                Return _salary
            End Get
            Set(value As Decimal)
                _salary = value
                RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(NameOf(Salary)))
            End Set
        End Property
    
    End Class
    

El objeto de datos employee es una clase sencilla que describe a un empleado:

  • Nombre y apellido del empleado.
  • Fecha en la que se contrató al empleado.
  • Título de la empresa del empleado.
  • Cuánto ingresos gana el empleado.

Enlazar a un objeto de datos

En el código XAML siguiente se muestra el uso de la Employee clase como un objeto de datos. La propiedad del DataContext elemento raíz está enlazada a un recurso estático declarado en xaml. Los controles individuales se enlazan a las propiedades de .Employee

  1. Agregue una nueva ventana al proyecto y asígnele el nombre EmployeeView

  2. Reemplace xaml por el fragmento de código siguiente:

    Importante

    El fragmento de código siguiente se toma de un proyecto de C#. Si usa Visual Basic, x:Class debe declararse sin el ArticleSample espacio de nombres. Puedes ver el aspecto de la versión de Visual Basic en EmployeeView.xaml.

    <Window x:Class="ArticleSample.EmployeeView"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:ArticleSample"
            Title="" Height="250" Width="300">
        <Window.Resources>
            <local:Employee x:Key="EmployeeExample" FirstName="Niki" LastName="Demetriou"
                                                    HireDate="2022-02-16" Salary="5012.00"
                                                    Title="Content Artist" />
        </Window.Resources>
        <StackPanel DataContext="{StaticResource EmployeeExample}">
            <Label FontSize="32">Employee</Label>
            <Border BorderBrush="Gray" BorderThickness="2" />
            <Grid Grid.Row="1" Margin="5">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
    
                <TextBlock Text="First Name:" Grid.Row="0" Margin="0,0,10,0" />
                <TextBlock Text="Last Name:" Grid.Row="1" />
                <TextBlock Text="Title:" Grid.Row="2" />
                <TextBlock Text="Hire Date:" Grid.Row="3" />
                <TextBlock Text="Salary" Grid.Row="4" />
    
                <TextBlock Text="{Binding FirstName}" Grid.Row="0" Grid.Column="1" />
                <TextBlock Text="{Binding LastName}" Grid.Row="1" Grid.Column="1" />
                <TextBlock Text="{Binding Title}" Grid.Row="2" Grid.Column="1" />
                <TextBlock Text="{Binding HireDate, StringFormat=d}" Grid.Row="3" Grid.Column="1" />
                <TextBlock Text="{Binding Salary, StringFormat=C0}" Grid.Row="4" Grid.Column="1" />
            </Grid>
            <Border BorderBrush="Gray" BorderThickness="2" />
            
            <StackPanel Margin="5,10" Orientation="Horizontal">
                <TextBlock Text="Change Salary:" Margin="0,0,10,0" />
                <TextBox Text="{Binding Salary, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, StringFormat=C0}" Width="100" />
            </StackPanel>
        </StackPanel>
    </Window>
    

El espacio de nombres del código no coincidirá con el espacio de nombres del proyecto, a menos que haya creado un proyecto denominado ArticleSample. Puede copiar y pegar el Window.Resources y el elemento raíz (StackPanel) en su MainWindow si creó un nuevo proyecto.

Para comprender mejor cómo el XAML anterior está utilizando la vinculación de datos, tenga en cuenta los siguientes puntos:

  • Un recurso XAML se usa para crear una instancia de la Employee clase .

    Normalmente, el objeto de datos se pasa a o se asocia a la ventana. En este ejemplo se codifica de forma dura al empleado con fines de demostración.

    <Window.Resources>
        <local:Employee x:Key="EmployeeExample" FirstName="Niki" LastName="Demetriou"
                                                HireDate="2022-02-16" Salary="5012.00"
                                                Title="Content Artist" />
    </Window.Resources>
    
  • El elemento raíz (StackPanel) tiene su contexto de datos configurado a la instancia con código fijo de Employee.

    Los elementos secundarios heredan su DataContext del elemento primario, a menos que se establezcan explícitamente.

    <StackPanel DataContext="{StaticResource EmployeeExample}">
    
  • Las propiedades de la Employee instancia están enlazadas a los TextBlock controles.

    Binding no especifica un BindingSource, por lo que DataContext se usa como origen.

    <TextBlock Text="{Binding FirstName}" Grid.Row="0" Grid.Column="1" />
    <TextBlock Text="{Binding LastName}" Grid.Row="1" Grid.Column="1" />
    <TextBlock Text="{Binding Title}" Grid.Row="2" Grid.Column="1" />
    <TextBlock Text="{Binding HireDate, StringFormat=d}" Grid.Row="3" Grid.Column="1" />
    <TextBlock Text="{Binding Salary, StringFormat=C0}" Grid.Row="4" Grid.Column="1" />
    
  • Un TextBox control está enlazado en el TwoWay modo, permitiendo que el TextBox cambie la propiedad Employee.Salary.

    <TextBox Text="{Binding Salary, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, StringFormat=C0}" Width="100" />