Información general sobre el enlace de datosData Binding Overview

El enlace de datos Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) proporciona una manera sencilla y coherente para que las aplicaciones presenten datos e interactúen con ellos.Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) data binding provides a simple and consistent way for applications to present and interact with data. Los elementos se pueden enlazar a los datos de una variedad de orígenes de datos en forma de objetos Common Language Runtime ( XMLXMLCLR) y.Elements can be bound to data from a variety of data sources in the form of common language runtime (CLR) objects and XMLXML. ContentControlItemsControls como Button y sListBox como yListView tienen funcionalidad integrada para habilitar el estilo flexible de elementos de datos individuales o colecciones de elementos de datos.ContentControls such as Button and ItemsControls such as ListBox and ListView have built-in functionality to enable flexible styling of single data items or collections of data items. Se pueden generar vistas de ordenación, filtrado ya agrupación encima de los datos.Sort, filter, and group views can be generated on top of the data.

La funcionalidad de enlace de datos de WPFWPF presenta varias ventajas con respecto a los modelos tradicionales, como un mayor número de propiedades que admiten de forma inherente el enlace de datos, una representación flexible de los datos en la IUUI y la separación bien definida de la lógica del negocio de IUUI.The data binding functionality in WPFWPF has several advantages over traditional models, including a broad range of properties that inherently support data binding, flexible IUUI representation of data, and clean separation of business logic from IUUI.

En primer lugar, en WPFWPF este tema se describen los conceptos fundamentales del enlace de datos y, a continuación, se usa Binding la clase y otras características del enlace de datos.This topic first discusses concepts fundamental to WPFWPF data binding and then goes into the usage of the Binding class and other features of data binding.

¿Qué es el enlace de datos?What Is Data Binding?

El enlace de datos es el proceso que establece una conexión entre la IUUI de la aplicación y la lógica de negocios.Data binding is the process that establishes a connection between the application IUUI and business logic. Si el enlace está configurado correctamente y los datos proporcionan las notificaciones adecuadas, al cambiar los valores de los datos, los elementos enlazados a los datos reflejarán de manera automática dichos cambios.If the binding has the correct settings and the data provides the proper notifications, then, when the data changes its value, the elements that are bound to the data reflect changes automatically. El enlace de datos también puede implicar la actualización automática de los datos que subyacen a una representación externa de los datos de un elemento, cuando esta representación cambia.Data binding can also mean that if an outer representation of the data in an element changes, then the underlying data can be automatically updated to reflect the change. Por ejemplo, si el usuario edita el valor en un TextBox elemento, el valor de los datos subyacentes se actualiza automáticamente para reflejar ese cambio.For example, if the user edits the value in a TextBox element, the underlying data value is automatically updated to reflect that change.

Un uso típico del enlace de datos es colocar los datos de configuración locales o de servidor en formularios o en otros controles de la IUUI.A typical use of data binding is to place server or local configuration data into forms or other IUUI controls. En WPFWPF, este concepto se expande para incluir el enlace de un gran número de propiedades a una gran variedad de orígenes de datos.In WPFWPF, this concept is expanded to include the binding of a broad range of properties to a variety of data sources. En WPFWPF, las propiedades de dependencia de los elementos se pueden enlazar a objetos CLR (incluidos los objetos ADO.net u objetos asociados a servicios Web XMLXML y propiedades web) y los datos.In WPFWPF, dependency properties of elements can be bound to CLR objects (including ADO.NET objects or objects associated with Web Services and Web properties) and XMLXML data.

Para obtener un ejemplo de enlace de datos, examine la siguiente IUUI de la aplicación Data Binding Demo:For an example of data binding, take a look at the following application IUUI from the Data Binding Demo:

Captura de pantalla de ejemplo de enlace de datosData binding sample screenshot

El ejemplo anterior es la IUUI de una aplicación que muestra una lista de artículos subastados.The above is the IUUI of an application that displays a list of auction items. La aplicación muestra las características siguientes de enlace de datos:The application demonstrates the following features of data binding:

  • El contenido de ListBox se enlaza a una colección de objetos AuctionItem .The content of the ListBox is bound to a collection of AuctionItem objects. Un objeto AuctionItem tiene propiedades como Description, StartPrice, StartDate, Category, SpecialFeatures, etc.An AuctionItem object has properties such as Description, StartPrice, StartDate, Category, SpecialFeatures, etc.

  • Los datos (objetosAuctionItem ) que se muestran ListBox en el están con plantilla para que la descripción y el precio actual se muestren para cada elemento.The data (AuctionItem objects) displayed in the ListBox is templated so that the description and the current price are shown for each item. Esto se hace mediante DataTemplate.This is done using a DataTemplate. Además, la apariencia de cada artículo depende del valor de SpecialFeatures del elemento AuctionItem que se muestra.In addition, the appearance of each item depends on the SpecialFeatures value of the AuctionItem being displayed. Si el valor de SpecialFeatures de AuctionItem es Color, el artículo tiene un borde azul.If the SpecialFeatures value of the AuctionItem is Color, the item has a blue border. Si el valor es Highlight, el artículo tiene un borde naranja y una estrella.If the value is Highlight, the item has an orange border and a star. En la sección Plantillas de datos se proporciona información sobre las plantillas de datos.The Data Templating section provides information about data templating.

  • El usuario puede agrupar, filtrar u ordenar los datos mediante CheckBoxlas proporcionadas.The user can group, filter, or sort the data using the CheckBoxes provided. En la imagen anterior, se seleccionan las casillas "agrupar por categoría" y CheckBox"ordenar por categoría y fecha".In the image above, the "Group by category" and "Sort by category and date" CheckBoxes are selected. Es posible que haya observado que los datos se agrupan en función de la categoría del producto, y el nombre de las categorías se muestra en orden alfabético.You may have noticed that the data is grouped based on the category of the product, and the category name is in alphabetical order. Aunque no se aprecia muy bien en la imagen, los artículos están ordenados también por fecha de inicio dentro de cada categoría.It is difficult to notice from the image but the items are also sorted by the start date within each category. Esto se realiza mediante una vista de colección.This is done using a collection view. En la sección Enlace a colecciones se describen las vistas de colección.The Binding to Collections section discusses collection views.

  • Cuando el usuario selecciona un elemento, ContentControl muestra los detalles del elemento seleccionado.When the user selects an item, the ContentControl displays the details of the selected item. Esto recibe el nombre de escenario principal-detalle .This is called the Master-Detail scenario. En la sección Escenario principal-detalle se proporciona información sobre este tipo de escenario de enlace.The Master-Detail Scenario section provides information about this type of binding scenario.

  • El tipo de la propiedad startDate es DateTime, que devuelve una fecha que incluye el tiempo en milisegundos.The type of the StartDate property is DateTime, which returns a date that includes the time to the millisecond. En esta aplicación, se ha utilizado un convertidor personalizado para que se muestre una cadena de fecha más corta.In this application, a custom converter has been used so that a shorter date string is displayed. En la sección Conversión de datos se proporciona información sobre los convertidores.The Data Conversion section provides information about converters.

Cuando el usuario hace clic en el botón Add product, se muestra el siguiente formulario:When the user clicks the Add Product button, the following form comes up:

Página de listado para agregar productoAdd Product Listing page

El usuario puede modificar los campos del formulario, obtener una vista previa de la lista de productos mediante la vista previa abreviada y los paneles de vista previa más detallada y, a continuación, hacer clic en submit para agregar la nueva lista de productos.The user can edit the fields in the form, preview the product listing using the short preview and the more detailed preview panes, and then click submit to add the new product listing. Todas las funciones de agrupación, filtrado y ordenación existentes se aplicarán a la nueva entrada.Any existing grouping, filtering and sorting functionalities will apply to the new entry. En este caso en concreto, el artículo especificado en la imagen anterior se mostrará como el segundo artículo dentro de la categoría Computer.In this particular case, the item entered in the above image will be displayed as the second item within the Computer category.

No se muestra en esta imagen la lógica de validación proporcionada en la fecha TextBoxde inicio.Not shown in this image is the validation logic provided in the Start Date TextBox. Si el usuario escribe una fecha no válida (formato no válido o fecha pasada), se notificará al usuario con un ToolTip y un signo de exclamación rojo junto TextBoxa.If the user enters an invalid date (invalid formatting or a past date), the user will be notified with a ToolTip and a red exclamation point next to the TextBox. En la sección Validación de datos se describe cómo crear lógica de validación.The Data Validation section discusses how to create validation logic.

Antes de abordar las diferentes características de enlace de datos citadas anteriormente, en la siguiente sección explicaremos los conceptos fundamentales imprescindibles para comprender el enlace de datos de WPFWPF.Before going into the different features of data binding outlined above, we will first discuss in the next section the fundamental concepts that are critical to understanding WPFWPF data binding.

Conceptos básicos del enlace de datosBasic Data Binding Concepts

Independientemente del elemento que se vaya a enlazar y de la naturaleza del origen de datos, cada enlace sigue siempre el modelo que se muestra en la ilustración siguiente:Regardless of what element you are binding and the nature of your data source, each binding always follows the model illustrated by the following figure:

Diagrama que muestra el modelo básico de enlace de datos.

Como se muestra en la ilustración anterior, el enlace de datos es esencialmente el puente entre el destino del enlace y el origen del enlace.As illustrated by the above figure, data binding is essentially the bridge between your binding target and your binding source. En la ilustración se muestran los siguientes conceptos fundamentales del enlace de datos de WPFWPF:The figure demonstrates the following fundamental WPFWPF data binding concepts:

  • Normalmente, cada enlace tiene estos cuatro componentes: un objeto de destino del enlace, una propiedad de destino, un origen del enlace y una ruta de acceso al valor en el origen del enlace que se va a usar.Typically, each binding has these four components: a binding target object, a target property, a binding source, and a path to the value in the binding source to use. Por ejemplo, si desea enlazar el contenido TextBox de a la propiedad de nombre de un objeto de empleado TextBox, el objeto de destino es, la propiedad de destino es la Text propiedad, el valor que se va a usar es el nombrey el el objeto de origen es el objeto de empleado .For example, if you want to bind the content of a TextBox to the Name property of an Employee object, your target object is the TextBox, the target property is the Text property, the value to use is Name, and the source object is the Employee object.

  • La propiedad de destino debe ser una propiedad de dependencia.The target property must be a dependency property. La UIElement mayoría de las propiedades son propiedades de dependencia y la mayoría de las propiedades de dependencia, excepto las de solo lectura, admiten el enlace de datos de forma predeterminada.Most UIElement properties are dependency properties and most dependency properties, except read-only ones, support data binding by default. (Solo DependencyObject los tipos pueden definir propiedades de dependencia UIElementy todas derivan de DependencyObject.)(Only DependencyObject types can define dependency properties and all UIElements derive from DependencyObject.)

  • Aunque no se especifica en la ilustración, se debe tener en cuentan que el objeto de origen de enlace no está restringido a ser un objeto CLR personalizado.Although not specified in the figure, it should be noted that the binding source object is not restricted to being a custom CLR object. WPFWPFel enlace de datos admite datos en forma de objetos CLR XMLXMLy.data binding supports data in the form of CLR objects and XMLXML. Para proporcionar algunos ejemplos, el origen del enlace puede ser UIElement, cualquier objeto de lista, un objeto CLR que esté asociado a datos ADO.net o servicios Web, o un XmlNode que contenga los XMLXML datos.To provide some examples, your binding source may be a UIElement, any list object, a CLR object that is associated with ADO.NET data or Web Services, or an XmlNode that contains your XMLXML data. Para más información, consulte Binding Sources Overview (Introducción a los orígenes de enlace).For more information, see Binding Sources Overview.

Al leer otros temas del SDK, es importante recordar que, al establecer un enlace, se enlaza un destino de enlace a un origen de enlace.As you read through other SDK topics, it is important to remember that when you are establishing a binding, you are binding a binding target to a binding source. Por ejemplo, XMLXML si va ListBox a mostrar algunos datos subyacentes en ListBox un enlace de datos con, va a enlazar XMLXML a los datos.For example, if you are displaying some underlying XMLXML data in a ListBox using data binding, you are binding your ListBox to the XMLXML data.

Para establecer un enlace, se utiliza el Binding objeto.To establish a binding, you use the Binding object. En el resto de este tema se describen muchos de los conceptos asociados a y algunas de las propiedades y el uso Binding del objeto.The rest of this topic discusses many of the concepts associated with and some of the properties and usage of the Binding object.

Dirección del flujo de datosDirection of the Data Flow

Como se mencionó anteriormente y como se indica en la flecha de la ilustración anterior, el flujo de datos de un enlace puede pasar del destino de enlace al origen de enlace (por ejemplo, el valor de origen cambia cuando un usuario edita el TextBoxvalor de un) y/o desde el origen de enlace. en el destino de enlace (por ejemplo, TextBox el contenido se actualiza con los cambios en el origen de enlace) si el origen de enlace proporciona las notificaciones adecuadas.As mentioned previously and as indicated by the arrow in the figure above, the data flow of a binding can go from the binding target to the binding source (for example, the source value changes when a user edits the value of a TextBox) and/or from the binding source to the binding target (for example, your TextBox content gets updated with changes in the binding source) if the binding source provides the proper notifications.

Tal vez desee que su aplicación permita que los usuarios cambien los datos y los propaguen al objeto de origen.You may want your application to enable users to change the data and propagate it back to the source object. O bien, no puede permitir a los usuarios actualizar los datos de origen.Or you may not want to enable users to update the source data. Puede controlar esto estableciendo la Mode propiedad Binding del objeto.You can control this by setting the Mode property of your Binding object. En la ilustración siguiente se muestran los distintos tipos de flujo de datos:The following figure illustrates the different types of data flow:

Flujo de datos de enlace de datosData binding data flow

  • OneWayel enlace hace que los cambios en la propiedad de origen actualicen automáticamente la propiedad de destino, pero los cambios en la propiedad de destino no se propagan de nuevo a la propiedad de origen.OneWay binding causes changes to the source property to automatically update the target property, but changes to the target property are not propagated back to the source property. Este tipo de enlace es adecuado si el control que se está enlazando es implícitamente de solo lectura.This type of binding is appropriate if the control being bound is implicitly read-only. Por ejemplo, podría enlazar a un origen como un tablero de cotizaciones o quizás su propiedad de destino no tenga ninguna interfaz de control para realizar modificaciones, como un color de fondo enlazado a datos de una tabla.For instance, you may bind to a source such as a stock ticker or perhaps your target property has no control interface provided for making changes, such as a data-bound background color of a table. Si no es necesario supervisar los cambios de la propiedad de destino, el uso del modo de enlace OneWay evita la sobrecarga del modo de enlace TwoWay.If there is no need to monitor the changes of the target property, using the OneWay binding mode avoids the overhead of the TwoWay binding mode.

  • TwoWayel enlace hace que los cambios en la propiedad de origen o en la propiedad de destino actualicen automáticamente el otro.TwoWay binding causes changes to either the source property or the target property to automatically update the other. Este tipo de enlace es adecuado para formularios modificables u otros escenarios IUUI completamente interactivos.This type of binding is appropriate for editable forms or other fully-interactive IUUI scenarios. La mayoría de las OneWay propiedades tienen como valor predeterminado el enlace, pero algunas propiedades de dependencia (normalmente, las Text propiedades de los controles editables por el usuario, como la propiedad de TextBox y la IsChecked propiedad de CheckBox) tienen como valor predeterminado TwoWay enlace.Most properties default to OneWay binding, but some dependency properties (typically properties of user-editable controls such as the Text property of TextBox and the IsChecked property of CheckBox) default to TwoWay binding. Una manera de determinar mediante programación si una propiedad de dependencia se enlaza de forma predeterminada de modo unidireccional o bidireccional es obtener los metadatos de la propiedad mediante GetMetadata y luego comprobar el valor booleano de la propiedad BindsTwoWayByDefault.A programmatic way to determine whether a dependency property binds one-way or two-way by default is to get the property metadata of the property using GetMetadata and then check the Boolean value of the BindsTwoWayByDefault property.

  • OneWayToSourcees el inverso OneWay del enlace; actualiza la propiedad de origen cuando cambia la propiedad de destino.OneWayToSource is the reverse of OneWay binding; it updates the source property when the target property changes. Podría utilizar este tipo de enlace si, por ejemplo, solo necesita volver a evaluar el valor de origen de la IUUI.One example scenario is if you only need to re-evaluate the source value from the IUUI.

  • No se OneTime muestra en la ilustración el enlace, que hace que la propiedad de origen inicialice la propiedad de destino, pero los cambios subsiguientes no se propagan.Not illustrated in the figure is OneTime binding, which causes the source property to initialize the target property, but subsequent changes do not propagate. Esto significa que si el contexto de los datos sufre un cambio o el objeto del contexto de datos cambia, el cambio no se refleja en la propiedad de destino.This means that if the data context undergoes a change or the object in the data context changes, then the change is not reflected in the target property. Este tipo de enlace es adecuado si usa datos donde una instantánea del estado actual es adecuada para su uso o los datos son realmente estáticos.This type of binding is appropriate if you are using data where either a snapshot of the current state is appropriate to use or the data is truly static. Este tipo de enlace también es útil si quiere inicializar la propiedad de destino con algún valor de una propiedad de origen y no se conoce el contexto de datos de antemano.This type of binding is also useful if you want to initialize your target property with some value from a source property and the data context is not known in advance. Se trata básicamente de una forma más sencilla de enlace OneWay que ofrece un mejor rendimiento en casos donde el valor de origen no cambia.This is essentially a simpler form of OneWay binding that provides better performance in cases where the source value does not change.

Tenga en cuenta que para detectar los cambios de OneWay origen TwoWay (aplicables a los enlaces y), el origen debe implementar un mecanismo de notificación INotifyPropertyChangedde cambio de propiedad adecuado como.Note that to detect source changes (applicable to OneWay and TwoWay bindings), the source must implement a suitable property change notification mechanism such as INotifyPropertyChanged. Vea implementar la notificación de cambio de propiedad para obtener INotifyPropertyChanged un ejemplo de una implementación de.See Implement Property Change Notification for an example of an INotifyPropertyChanged implementation.

La Mode página de propiedades proporciona más información sobre los modos de enlace y un ejemplo de cómo especificar la dirección de un enlace.The Mode property page provides more information about binding modes and an example of how to specify the direction of a binding.

Qué desencadena la actualización del origenWhat Triggers Source Updates

Enlaces que son TwoWay o OneWayToSource escuchan los cambios en la propiedad de destino y los propagan de nuevo al origen.Bindings that are TwoWay or OneWayToSource listen for changes in the target property and propagate them back to the source. Esto se conoce como el origen de la actualización.This is known as updating the source. Por ejemplo, puede modificar el texto de un control TextBox para cambiar el valor de origen subyacente.For example, you may edit the text of a TextBox to change the underlying source value. Tal y como se describe en la última sección, el valor de la Mode propiedad del enlace determina la dirección del flujo de datos.As described in the last section, the direction of the data flow is determined by the value of the Mode property of the binding.

Pero ¿se actualizará su valor de origen mientras edita el texto o después de terminar de editarlo y sacar el mouse fuera del control TextBox?However, does your source value get updated while you are editing the text or after you finish editing the text and point your mouse away from the TextBox? La UpdateSourceTrigger propiedad del enlace determina qué desencadena la actualización del origen.The UpdateSourceTrigger property of the binding determines what triggers the update of the source. En los puntos de las flechas de la derecha en la ilustración siguiente se muestra UpdateSourceTrigger el rol de la propiedad:The dots of the right arrows in the following figure illustrate the role of the UpdateSourceTrigger property:

Diagrama que muestra el rol de la propiedad UpdateSourceTrigger.

Si el UpdateSourceTrigger valor es PropertyChanged, el valor al que apunta la flecha derecha de o TwoWay los OneWayToSource enlaces se actualiza en cuanto cambia la propiedad de destino.If the UpdateSourceTrigger value is PropertyChanged, then the value pointed to by the right arrow of TwoWay or the OneWayToSource bindings gets updated as soon as the target property changes. Sin embargo, si UpdateSourceTrigger el valor LostFocuses, ese valor solo se actualiza con el nuevo valor cuando la propiedad de destino pierde el foco.However, if the UpdateSourceTrigger value is LostFocus, then that value only gets updated with the new value when the target property loses focus.

De forma similar Mode a la propiedad, las distintas propiedades de UpdateSourceTrigger dependencia tienen valores predeterminados diferentes.Similar to the Mode property, different dependency properties have different default UpdateSourceTrigger values. El valor predeterminado de la mayoría de las propiedades de dependencia es PropertyChanged, mientras que la propiedad Text tiene un valor predeterminado de LostFocus.The default value for most dependency properties is PropertyChanged, while the Text property has a default value of LostFocus. Esto significa que las actualizaciones de origen suelen ocurrir cada vez que cambia la propiedad de destino CheckBox, lo que es adecuado para es y otros controles simples.This means that source updates usually happen whenever the target property changes, which is fine for CheckBoxes and other simple controls. Sin embargo, para los campos de texto, la actualización cada vez que se pulsa una tecla puede disminuir el rendimiento y deniega al usuario la oportunidad usual de retroceder y corregir los errores tipográficos antes confirmar el nuevo valor.However, for text fields, updating after every keystroke can diminish performance and it denies the user the usual opportunity to backspace and fix typing errors before committing to the new value. Esa es la razón Text por la que la propiedad tiene LostFocus un valor predeterminado PropertyChangedde en lugar de.That is why the Text property has a default value of LostFocus instead of PropertyChanged.

Vea la UpdateSourceTrigger página de propiedades para obtener información sobre cómo buscar el UpdateSourceTrigger valor predeterminado de una propiedad de dependencia.See the UpdateSourceTrigger property page for information about how to find the default UpdateSourceTrigger value of a dependency property.

En la tabla siguiente se proporciona un escenario de UpdateSourceTrigger ejemplo para cada TextBox valor que usa como ejemplo:The following table provides an example scenario for each UpdateSourceTrigger value using the TextBox as an example:

Valor UpdateSourceTriggerUpdateSourceTrigger value Cuándo se actualiza el valor de origenWhen the Source Value Gets Updated Escenario de ejemplo de TextBoxExample Scenario for TextBox
LostFocus (valor predeterminado TextBox.Textpara)LostFocus (default for TextBox.Text) Cuando el control TextBox pierde el focoWhen the TextBox control loses focus Que TextBox está asociado a la lógica de validación (consulte la sección validación de datos)A TextBox that is associated with validation logic (see Data Validation section)
PropertyChangedPropertyChanged A medida que escribe en elTextBoxAs you type into the TextBox TextBoxcontroles en una ventana de salón de chatTextBox controls in a chat room window
ExplicitExplicit Cuando la aplicación llama aUpdateSourceWhen the application calls UpdateSource TextBoxcontroles en un formulario editable (solo actualiza los valores de origen cuando el usuario hace clic en el botón Enviar)TextBox controls in an editable form (updates the source values only when the user clicks the submit button)

Para ver un ejemplo, consulte Controlar cuándo el texto de TextBox actualiza el origen.For an example, see Control When the TextBox Text Updates the Source.

Crear un enlaceCreating a Binding

Para recapitulación algunos de los conceptos descritos en las secciones anteriores, establezca un enlace mediante el Binding objeto, y cada enlace tiene normalmente cuatro componentes: destino de enlace, propiedad de destino, origen de enlace y una ruta de acceso al valor de origen que se va a usar.To recapitulate some of the concepts discussed in the previous sections, you establish a binding using the Binding object, and each binding usually has four components: binding target, target property, binding source, and a path to the source value to use. En esta sección describe cómo configurar un enlace.This section discusses how to set up a binding.

Considere el ejemplo siguiente, en el que el objeto de origen del enlace es una clase denominada MyData que se define en el espacio de nombres SDKSample.Consider the following example, in which the binding source object is a class named MyData that is defined in the SDKSample namespace. Para fines de demostración, la clase MyData tiene una propiedad de cadena denominada ColorName, cuyo valor se establece en "Red".For demonstration purposes, MyData class has a string property named ColorName, of which the value is set to "Red". Por lo tanto, este ejemplo genera un botón con un fondo rojo.Thus, this example generates a button with a red background.

<DockPanel
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:c="clr-namespace:SDKSample">
  <DockPanel.Resources>
    <c:MyData x:Key="myDataSource"/>
  </DockPanel.Resources>
  <DockPanel.DataContext>
    <Binding Source="{StaticResource myDataSource}"/>
  </DockPanel.DataContext>
  <Button Background="{Binding Path=ColorName}"
          Width="150" Height="30">I am bound to be RED!</Button>
</DockPanel>

Para más información sobre la sintaxis de declaración de enlaces y ejemplos sobre cómo configurar un enlace en código, consulte Información general sobre declaraciones de enlaces.For more details on the binding declaration syntax and for examples of how to set up a binding in code, see Binding Declarations Overview.

Si aplicamos este ejemplo a nuestro diagrama básico, la ilustración resultante tendrá el siguiente aspecto.If we apply this example to our basic diagram, the resulting figure looks like the following. Se trata de OneWay un enlace porque la propiedad Background OneWay admite el enlace de forma predeterminada.This is a OneWay binding because the Background property supports OneWay binding by default.

Diagrama que muestra la propiedad de fondo de enlace de datos.

Es posible que se pregunte por qué funciona aunque la propiedad ColorName sea de tipo Background String mientras que la Brushpropiedad es de tipo.You may wonder why this works even though the ColorName property is of type string while the Background property is of type Brush. Se ha aplicado la conversión predeterminada de tipos, que se explica en la sección Conversión de datos.This is default type conversion at work and is discussed in the Data Conversion section.

Especificación del origen de enlaceSpecifying the Binding Source

Observe que en el ejemplo anterior, el origen de enlace se especifica estableciendo la DataContext propiedad en el DockPanel elemento.Notice that in the previous example, the binding source is specified by setting the DataContext property on the DockPanel element. A continuación, hereda el DataContext valor de DockPanel, que es su elemento primario. ButtonThe Button then inherits the DataContext value from the DockPanel, which is its parent element. Recordemos que el objeto de origen del enlace es uno de los cuatro componentes necesarios de un enlace.To reiterate, the binding source object is one of the four necessary components of a binding. Por tanto, si no se especifica el objeto de origen del enlace, el enlace no funcionará.Therefore, without the binding source object being specified, the binding would do nothing.

Hay varias formas de especificar el objeto de origen del enlace.There are several ways to specify the binding source object. El uso DataContext de la propiedad en un elemento primario resulta útil cuando se enlazan varias propiedades al mismo origen.Using the DataContext property on a parent element is useful when you are binding multiple properties to the same source. Sin embargo, a veces puede ser más adecuado especificar el origen del enlace en declaraciones de enlace individuales.However, sometimes it may be more appropriate to specify the binding source on individual binding declarations. En el ejemplo anterior, en lugar de usar la DataContext propiedad, puede especificar el origen de enlace estableciendo la Source propiedad directamente en la declaración de enlace del botón, como en el ejemplo siguiente:For the previous example, instead of using the DataContext property, you can specify the binding source by setting the Source property directly on the binding declaration of the button, as in the following example:

<DockPanel.Resources>
  <c:MyData x:Key="myDataSource"/>
</DockPanel.Resources>
<Button Width="150" Height="30"
        Background="{Binding Source={StaticResource myDataSource},
                             Path=ColorName}">I am bound to be RED!</Button>

Además de establecer la DataContext propiedad en un elemento directamente, heredando el DataContext valor de un antecesor (como el botón en el primer ejemplo) y especificando explícitamente el origen de enlace estableciendo la Source propiedad en el Binding (como el botón del último ejemplo), también puede usar la ElementName propiedad o la RelativeSource propiedad para especificar el origen de enlace.Other than setting the DataContext property on an element directly, inheriting the DataContext value from an ancestor (such as the button in the first example), and explicitly specifying the binding source by setting the Source property on the Binding (such as the button the last example), you can also use the ElementName property or the RelativeSource property to specify the binding source. La ElementName propiedad es útil cuando se enlaza a otros elementos de la aplicación, como cuando se usa un control deslizante para ajustar el ancho de un botón.The ElementName property is useful when you are binding to other elements in your application, such as when you are using a slider to adjust the width of a button. La RelativeSource propiedad es útil cuando el enlace se especifica ControlTemplate en o Style.The RelativeSource property is useful when the binding is specified in a ControlTemplate or a Style. Para más información, consulte Especificación del origen de enlace.For more information, see Specify the Binding Source.

Especificación de la ruta de acceso al valorSpecifying the Path to the Value

Si el origen de enlace es un objeto, utilice la Path propiedad para especificar el valor que se va a usar para el enlace.If your binding source is an object, you use the Path property to specify the value to use for your binding. Si va a enlazar XMLXML a datos, use la XPath propiedad para especificar el valor.If you are binding to XMLXML data, you use the XPath property to specify the value. En algunos casos, puede ser aplicable usar la Path propiedad incluso cuando los datos son. XMLXMLIn some cases, it may be applicable to use the Path property even when your data is XMLXML. Por ejemplo, si desea tener acceso a la propiedad Name de un XmlNode devuelto (como resultado de una consulta XPath), debe usar la Path propiedad además de la XPath propiedad.For example, if you want to access the Name property of a returned XmlNode (as a result of an XPath query), you should use the Path property in addition to the XPath property.

Para obtener información sobre la sintaxis y ejemplos Path , XPath vea las páginas de propiedades y.For syntax information and examples, see the Path and XPath property pages.

Tenga en cuenta que aunque hemos resaltado Path que al valor que se va a usar es uno de los cuatro componentes necesarios de un enlace, en los escenarios que desea enlazar a un objeto completo, el valor que se va a usar será el mismo que el objeto de origen del enlace.Note that although we have emphasized that the Path to the value to use is one of the four necessary components of a binding, in the scenarios which you want to bind to an entire object, the value to use would be the same as the binding source object. En esos casos, es aplicable no especificar un Path.In those cases, it is applicable to not specify a Path. Considere el ejemplo siguiente:Consider the following example:

<ListBox ItemsSource="{Binding}"
         IsSynchronizedWithCurrentItem="true"/>

En el ejemplo anterior se utiliza la sintaxis de enlace vacía: {Binding}.The above example uses the empty binding syntax: {Binding}. En este caso, ListBox hereda el DataContext de un elemento DockPanel primario (no se muestra en este ejemplo).In this case, the ListBox inherits the DataContext from a parent DockPanel element (not shown in this example). Cuando no se especifica la ruta de acceso, el valor predeterminado es enlazar al objeto completo.When the path is not specified, the default is to bind to the entire object. En otras palabras, en este ejemplo, la ruta de acceso se ha omitido porque se enlaza ItemsSource la propiedad a todo el objeto.In other words, in this example, the path has been left out because we are binding the ItemsSource property to the entire object. (Consulte la sección Enlace a colecciones para obtener información detallada).(See the Binding to Collections section for an in-depth discussion.)

Además del enlace a una colección, este escenario es útil también cuando se desea enlazar a un objeto completo en lugar de simplemente a una propiedad individual de un objeto.Other than binding to a collection, this scenario is also useful when you want to bind to an entire object instead of just a single property of an object. Por ejemplo, si el objeto de origen es de tipo string y simplemente desea enlazar a la propia cadena.For example, if your source object is of type string and you simply want to bind to the string itself. Otro escenario común es cuando se desea enlazar un elemento a un objeto con varias propiedades.Another common scenario is when you want to bind an element to an object with several properties.

Observe que puede ser necesario aplicar lógica personalizada para que los datos sean significativos para la propiedad de destino enlazada.Note that you may need to apply custom logic so that the data is meaningful to your bound target property. La lógica personalizada puede consistir en un convertidor personalizado (si no existe la conversión de tipos predeterminada).The custom logic may be in the form of a custom converter (if default type conversion does not exist). Consulte Conversión de datos para obtener información sobre los convertidores.See Data Conversion for information about converters.

Binding and BindingExpressionBinding and BindingExpression

Antes de entrar en otras características y usos del enlace de datos, sería útil introducir la BindingExpression clase.Before getting into other features and usages of data binding, it would be useful to introduce the BindingExpression class. Como ha podido observar en las secciones anteriores, Binding la clase es la clase de alto nivel para la declaración de un enlace; Binding la clase proporciona muchas propiedades que le permiten especificar las características de un enlace.As you have seen in previous sections, the Binding class is the high-level class for the declaration of a binding; the Binding class provides many properties that allow you to specify the characteristics of a binding. Una clase relacionada BindingExpression,, es el objeto subyacente que mantiene la conexión entre el origen y el destino.A related class, BindingExpression, is the underlying object that maintains the connection between the source and the target. Un enlace contiene toda la información que se puede compartir entre varias expresiones de enlace.A binding contains all the information that can be shared across several binding expressions. Una BindingExpression es una expresión Bindingde instancia que no se puede compartir y contiene toda la información de instancia de.A BindingExpression is an instance expression that cannot be shared and contains all the instance information of the Binding.

Por ejemplo, considere lo siguiente, donde myDataObject es una instancia de la clase de datos , myBinding es el objeto Binding de origen y la clase de datos es una clase definida que contiene una propiedad de cadena denominada MyDataProperty.For example, consider the following, where myDataObject is an instance of MyData class, myBinding is the source Binding object, and MyData class is a defined class that contains a string property named MyDataProperty. En este ejemplo se enlaza el contenido de texto de @ Text, una TextBlockinstancia de, a MyDataProperty.This example binds the text content of mytext, an instance of TextBlock, to MyDataProperty.

// Make a new source.
MyData myDataObject = new MyData(DateTime.Now);      
Binding myBinding = new Binding("MyDataProperty");
myBinding.Source = myDataObject;
// Bind the new data source to the myText TextBlock control's Text dependency property.
myText.SetBinding(TextBlock.TextProperty, myBinding);
' Make a new source.
Dim data1 As New MyData(DateTime.Now)
Dim binding1 As New Binding("MyDataProperty")
binding1.Source = data1
' Bind the new data source to the myText TextBlock control's Text dependency property.
Me.myText.SetBinding(TextBlock.TextProperty, binding1)

Puede usar el mismo objeto myBinding para crear otros enlaces.You can use the same myBinding object to create other bindings. Por ejemplo, puede usar el objeto myBinding para enlazar el contenido de texto de una casilla a MyDataProperty.For example, you may use myBinding object to bind the text content of a check box to MyDataProperty. En ese escenario, habrá dos instancias de BindingExpression que comparten el objeto myBinding .In that scenario, there will be two instances of BindingExpression sharing the myBinding object.

Un BindingExpression objeto se puede obtener mediante el valor devuelto de GetBindingExpression la llamada a en un objeto enlazado a datos.A BindingExpression object can be obtained through the return value of calling GetBindingExpression on a data-bound object. En los temas siguientes se muestran algunos de los usos de BindingExpression la clase:The following topics demonstrate some of the usages of the BindingExpression class:

Conversión de datosData Conversion

En el ejemplo anterior, el botón es rojo porque su Background propiedad está enlazada a una propiedad de cadena con el valor "red".In the previous example, the button is red because its Background property is bound to a string property with the value "Red". Esto funciona porque un convertidor de tipos está presente en Brush el tipo para convertir el valor de cadena Brushen un.This works because a type converter is present on the Brush type to convert the string value to a Brush.

Al agregar esta información a la ilustración de la sección Creación de un enlace, obtenemos el diagrama siguiente:To add this information to the figure in the Creating a Binding section, the diagram looks like the following:

Diagrama que muestra la propiedad de enlace de datos predeterminada.

Sin embargo, ¿qué ocurre si, en lugar de tener una propiedad de tipo cadena, el objeto de origen de Colorenlace tiene una propiedad color de tipo?However, what if instead of having a property of type string your binding source object has a Color property of type Color? En ese caso, para que el enlace funcione, deberá convertir primero el valor de la propiedad color en algo que la Background propiedad acepte.In that case, in order for the binding to work you would need to first turn the Color property value into something that the Background property accepts. Necesitaría crear un convertidor personalizado implementando la IValueConverter interfaz, como en el ejemplo siguiente:You would need to create a custom converter by implementing the IValueConverter interface, as in the following example:

[ValueConversion(typeof(Color), typeof(SolidColorBrush))]
public class ColorBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Color color = (Color)value;
        return new SolidColorBrush(color);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }
}
<ValueConversion(GetType(Color), GetType(SolidColorBrush))>
Public Class ColorBrushConverter
    Implements IValueConverter
    Public Function Convert(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements IValueConverter.Convert
        Dim color As Color = CType(value, Color)
        Return New SolidColorBrush(color)
    End Function

    Public Function ConvertBack(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements IValueConverter.ConvertBack
        Return Nothing
    End Function
End Class

La IValueConverter página de referencia proporciona más información.The IValueConverter reference page provides more information.

Ahora que se ha utilizado el convertidor personalizado en lugar de la conversión predeterminada, nuestro diagrama presenta el siguiente aspecto:Now the custom converter is used instead of default conversion, and our diagram looks like this:

Diagrama que muestra el convertidor personalizado de enlace de datos.

Recordemos que las conversiones predeterminadas pueden estar disponibles si el tipo que se va a enlazar contiene convertidores de tipo.To reiterate, default conversions may be available because of type converters that are present in the type being bound to. Este comportamiento dependerá de los convertidores de tipos disponibles en el destino.This behavior will depend on which type converters are available in the target. Si no está seguro, cree su propio convertidor.If in doubt, create your own converter.

A continuación, se incluyen algunos escenarios típicos en los que sería lógico implementar un convertidor de datos:Following are some typical scenarios where it makes sense to implement a data converter:

  • Los datos se muestran de forma diferente, dependiendo de la referencia cultural.Your data should be displayed differently, depending on culture. Por ejemplo, tal vez desee implementar un convertidor de monedas o un convertidor de fechas y horas del calendario en función de los valores o normas utilizados en una determinada referencia cultural.For instance, you might want to implement a currency converter or a calendar date/time converter based on the values or standards used in a particular culture.

  • Los datos que se utilizan no están diseñados necesariamente para cambiar el valor textual de una propiedad, sino para cambiar otro valor, como el origen de una imagen, o el color o estilo del texto que se va a mostrar.The data being used is not necessarily intended to change the text value of a property, but is instead intended to change some other value, such as the source for an image, or the color or style of the display text. En este caso se pueden utilizar convertidores para convertir el enlace de una propiedad que tal vez no sea adecuada, como el enlace de un campo de texto a la propiedad Background de una celda de tabla.Converters can be used in this instance by converting the binding of a property that might not seem to be appropriate, such as binding a text field to the Background property of a table cell.

  • Hay varios controles o varias propiedades de controles enlazados a los mismos datos.More than one control or to multiple properties of controls are bound to the same data. En ese caso, el enlace principal podría mostrar simplemente el texto, mientras que los otros enlaces controlan los aspectos de presentación, pero se sigue utilizando el mismo enlace como información de origen.In this case, the primary binding might just display the text, whereas other bindings handle specific display issues but still use the same binding as source information.

  • Hasta ahora todavía no hemos analizado MultiBinding, donde una propiedad de destino tiene una colección de enlaces.So far we have not yet discussed MultiBinding, where a target property has a collection of bindings. En el caso de MultiBinding, se usa una personalizada IMultiValueConverter para generar un valor final a partir de los valores de los enlaces.In the case of a MultiBinding, you use a custom IMultiValueConverter to produce a final value from the values of the bindings. Por ejemplo, el color podría calcularse a partir de los valores de rojo, azul y verde, que pueden ser valores de los mismos o de diferentes objetos de origen del enlace.For example, color may be computed from red, blue, and green values, which can be values from the same or different binding source objects. Vea la MultiBinding página de la clase para obtener ejemplos e información.See the MultiBinding class page for examples and information.

Enlace a coleccionesBinding to Collections

Un objeto de origen del enlace se puede tratar como un objeto único cuyas propiedades contienen los datos, o como una recolección de datos de objetos polimórficos que suelen estar agrupados (como el resultado de una consulta a una base de datos).A binding source object can be treated either as a single object of which the properties contain data or as a data collection of polymorphic objects that are often grouped together (such as the result of a query to a database). Hasta ahora solo hemos explicado el enlace a objetos individuales, pero el enlace a una recolección de datos es un escenario común.So far we've only discussed binding to single objects, however, binding to a data collection is a common scenario. Por ejemplo, un escenario común ItemsControl es usar un ListView ListBox, o TreeView para mostrar una recopilación de datos, como en la aplicación que se muestra en la sección ¿Qué es el enlace de datos? .For example, a common scenario is to use an ItemsControl such as a ListBox, ListView, or TreeView to display a data collection, such as in the application shown in the What Is Data Binding? section.

Afortunadamente, nuestro diagrama básico aún sigue siendo válido.Fortunately, our basic diagram still applies. Si enlaza un ItemsControl a una colección, el diagrama tiene el siguiente aspecto:If you are binding an ItemsControl to a collection, the diagram looks like this:

Diagrama que muestra el objeto ItemsControl de enlace de datos.

Como se muestra en este diagrama, para enlazar un ItemsControl a un objeto de colección, ItemsSource Property es la propiedad que se va a usar.As shown in this diagram, to bind an ItemsControl to a collection object, ItemsSource property is the property to use. Puede pensar ItemsSource en la propiedad como en el contenido ItemsControlde.You can think of ItemsSource property as the content of the ItemsControl. Tenga en cuenta que el OneWay enlace se ItemsSource debe a OneWay que la propiedad admite el enlace de forma predeterminada.Note that the binding is OneWay because the ItemsSource property supports OneWay binding by default.

Implementación de coleccionesHow to Implement Collections

Puede enumerar en cualquier colección que implementa la IEnumerable interfaz.You can enumerate over any collection that implements the IEnumerable interface. Sin embargo, para configurar enlaces dinámicos para que las inserciones o eliminaciones de la colección actualicen IUUI automáticamente, la colección debe implementar la INotifyCollectionChanged interfaz.However, to set up dynamic bindings so that insertions or deletions in the collection update the IUUI automatically, the collection must implement the INotifyCollectionChanged interface. Esta interfaz expone un evento que debe provocarse siempre que se realicen cambios en la colección subyacente.This interface exposes an event that should be raised whenever the underlying collection changes.

WPFWPFproporciona la ObservableCollection<T> clase, que es una implementación integrada de una colección de datos que expone la INotifyCollectionChanged interfaz.provides the ObservableCollection<T> class, which is a built-in implementation of a data collection that exposes the INotifyCollectionChanged interface. Tenga en cuenta que para admitir totalmente la transferencia de valores de datos de objetos de origen a destinos, cada objeto de la colección que admite propiedades enlazables también debe implementar la INotifyPropertyChanged interfaz.Note that to fully support transferring data values from source objects to targets, each object in your collection that supports bindable properties must also implement the INotifyPropertyChanged interface. Para más información, consulte Binding Sources Overview (Introducción a los orígenes de enlace).For more information, see Binding Sources Overview.

Antes de implementar su propia colección, considere ObservableCollection<T> la posibilidad de usar o una de las clases de List<T>colección Collection<T>existentes, BindingList<T>como, y, entre muchas otras.Before implementing your own collection, consider using ObservableCollection<T> or one of the existing collection classes, such as List<T>, Collection<T>, and BindingList<T>, among many others. Si tiene un escenario avanzado y desea implementar su propia colección, considere la posibilidad de IListusar, que proporciona una colección no genérica de objetos a los que se puede tener acceso individualmente por índice y, por lo tanto, el mejor rendimiento.If you have an advanced scenario and want to implement your own collection, consider using IList, which provides a non-generic collection of objects that can be individually accessed by index and thus the best performance.

Vistas de colecciónCollection Views

ItemsControl Una vez enlazado a una colección de datos, puede que desee ordenar, filtrar o agrupar los datos.Once your ItemsControl is bound to a data collection, you may want to sort, filter, or group the data. Para ello, use las vistas de colección, que son clases que implementan ICollectionView la interfaz.To do that, you use collection views, which are classes that implement the ICollectionView interface.

¿Qué son las vistas de colección?What Are Collection Views?

Una vista de colección es un nivel situado encima de la colección de origen del enlace, que le permite navegar y mostrar la colección de origen en función de las consultas de ordenación, filtrado y agrupación, sin tener que cambiar la propia colección de origen subyacente.A collection view is a layer on top of a binding source collection that allows you to navigate and display the source collection based on sort, filter, and group queries, without having to change the underlying source collection itself. Una vista de colección también contiene un puntero al elemento actual de la colección.A collection view also maintains a pointer to the current item in the collection. Si la colección de origen implementa la INotifyCollectionChanged interfaz, los cambios generados por CollectionChanged el evento se propagan a las vistas.If the source collection implements the INotifyCollectionChanged interface, the changes raised by the CollectionChanged event are propagated to the views.

Dado que las vistas no cambian las colecciones de origen subyacente, cada colección de origen puede tener varias vistas asociadas.Because views do not change the underlying source collections, each source collection can have multiple views associated with it. Por ejemplo, puede tener una colección de objetos Task.For example, you may have a collection of Task objects. El uso de vistas le permite mostrar los mismos datos de formas diferentes.With the use of views, you can display that same data in different ways. Por ejemplo, en el lado izquierdo de la página es posible que desee mostrar las tareas ordenadas por prioridad y, en el lado derecho, agrupadas por área.For example, on the left side of your page you may want to show tasks sorted by priority, and on the right side, grouped by area.

Creación de una vistaHow to Create a View

Una manera de crear y utilizar una vista es crear directamente una instancia del objeto de vista y utilizar a continuación esa instancia como el origen del enlace.One way to create and use a view is to instantiate the view object directly and then use it as the binding source. Por ejemplo, considere la aplicación Data Binding Demo que se muestra en la sección ¿Qué es el enlace de datos?.For example, consider the Data Binding Demo application shown in the What Is Data Binding? section. La aplicación se implementa de tal forma ListBox que se enlaza a una vista sobre la colección de datos en lugar de la colección de datos directamente.The application is implemented such that the ListBox binds to a view over the data collection instead of the data collection directly. El ejemplo siguiente se extrae de la aplicación Data Binding Demo.The following example is extracted from the Data Binding Demo application. La CollectionViewSource clase es el Lenguaje XAML (Extensible Application Markup Language)Extensible Application Markup Language (XAML) proxy de una clase que hereda de CollectionView.The CollectionViewSource class is the Lenguaje XAML (Extensible Application Markup Language)Extensible Application Markup Language (XAML) proxy of a class that inherits from CollectionView. En este ejemplo concreto, el Source de la vista se enlaza a la colección AuctionItems (de tipo ObservableCollection<T>) del objeto de aplicación actual.In this particular example, the Source of the view is bound to the AuctionItems collection (of type ObservableCollection<T>) of the current application object.

<Window.Resources>
<CollectionViewSource 
      Source="{Binding Source={x:Static Application.Current}, Path=AuctionItems}"   
      x:Key="listingDataView" />
</Window.Resources>

A continuación, el recurso listingDataView actúa como el origen de enlace para los elementos de la aplicación ListBox, como:The resource listingDataView then serves as the binding source for elements in the application, such as the ListBox:

<ListBox Name="Master" Grid.Row="2" Grid.ColumnSpan="3" Margin="8"
    ItemsSource="{Binding Source={StaticResource listingDataView}}">
</ListBox>

Para crear otra vista para la misma colección, puede crear otra CollectionViewSource instancia y asignarle un nombre diferente. x:KeyTo create another view for the same collection, you can create another CollectionViewSource instance and give it a different x:Key name.

En la tabla siguiente se muestran los tipos de datos de vista que se crean como vista CollectionViewSource de colección predeterminada o según el tipo de colección de origen.The following table shows which view data types are created as the default collection view or by CollectionViewSource based on the source collection type.

Tipo de colección de origenSource collection type Tipo de vista de colecciónCollection view type NotasNotes
IEnumerable Un tipo interno basado enCollectionViewAn internal type based on CollectionView No se pueden agrupar los elementos.Cannot group items.
IList ListCollectionView Más rápido.Fastest.
IBindingList BindingListCollectionView
Uso de una vista predeterminadaUsing a Default View

Especificar una vista de colección como origen de enlace es una forma de crear y utilizar una vista de colección.Specifying a collection view as a binding source is one way to create and use a collection view. WPF también crea una vista de colección predeterminada para cada colección utilizada como origen de enlace.WPF also creates a default collection view for every collection used as a binding source. Si enlaza directamente a una colección, WPF enlaza a su vista predeterminada.If you bind directly to a collection, WPF binds to its default view. Tenga en cuenta que todos los enlaces a una misma colección comparten esta vista predeterminada, de modo que si se realiza un cambio en una vista predeterminada a través de un control enlazado o mediante código (como un cambio de ordenación o en el puntero de elemento actual, que se describe más adelante), este se refleja en el resto de los enlaces a la misma colección.Note that this default view is shared by all bindings to the same collection, so a change made to a default view by one bound control or code (such as sorting or a change to the current item pointer, discussed later) is reflected in all other bindings to the same collection.

Para obtener la vista predeterminada, use el GetDefaultView método.To get the default view, you use the GetDefaultView method. Para ver un ejemplo, consulte Get the Default View of a Data Collection (Obtención de la vista predeterminada de una colección de datos).For an example, see Get the Default View of a Data Collection.

Vistas de colección con DataTables de ADO.NETCollection Views with ADO.NET DataTables

Para mejorar el rendimiento, las vistas de DataTable colección DataView para ADO.net o los objetos delegan la DataViewordenación y el filtrado en.To improve performance, collection views for ADO.NET DataTable or DataView objects delegate sorting and filtering to the DataView. Esto hace que todas las vistas de colección del origen de datos compartan la ordenación y el filtrado.This causes sorting and filtering to be shared across all collection views of the data source. Para habilitar cada vista de colección para ordenar y filtrar de forma independiente, inicialice cada vista DataView de colección con su propio objeto.To enable each collection view to sort and filter independently, initialize each collection view with its own DataView object.

OrdenarSorting

Como se mencionó anteriormente, las vistas pueden aplicar un criterio de ordenación a una colección.As mentioned before, views can apply a sort order to a collection. Cuando este criterio existe en la colección subyacente, los datos pueden o no tener un orden relevante inherente.As it exists in the underlying collection, your data may or may not have a relevant, inherent order. La vista de la colección le permite aplicar un orden o cambiar el orden predeterminado, en función de los criterios de comparación especificados.The view over the collection allows you to impose an order, or change the default order, based on comparison criteria that you supply. Como es una vista de datos basada en un cliente, podría ser habitual que el usuario quisiera ordenar las columnas de los datos de tabla por el valor correspondiente a la columna.Because it is a client-based view of the data, a common scenario is that the user might want to sort columns of tabular data per the value that the column corresponds to. Con las vistas, se puede aplicar esta ordenación controlada por el usuario, sin tener que realizar ningún cambio en la colección subyacente ni tener tampoco que volver a consultar el contenido de la colección.Using views, this user-driven sort can be applied, again without making any changes to the underlying collection or even having to requery for the collection content. Para ver un ejemplo, consulte Clasificación de una columna GridView cuando se hace clic en un encabezado.For an example, see Sort a GridView Column When a Header Is Clicked.

En el ejemplo siguiente se muestra la lógica de ordenación de "ordenar por categoría y CheckBox fecha" de IUUI la aplicación en la sección ¿Qué es el enlace de datos? :The following example shows the sorting logic of the "Sort by category and date" CheckBox of the application IUUI in the What Is Data Binding? section:

private void AddSorting(object sender, RoutedEventArgs args)
{
    // This sorts the items first by Category and within each Category,
    // by StartDate. Notice that because Category is an enumeration,
    // the order of the items is the same as in the enumeration declaration
    listingDataView.SortDescriptions.Add(
        new SortDescription("Category", ListSortDirection.Ascending));
    listingDataView.SortDescriptions.Add(
        new SortDescription("StartDate", ListSortDirection.Ascending));
}
Private Sub AddSorting(ByVal sender As Object, ByVal args As RoutedEventArgs)
    'This sorts the items first by Category and within each Category, by StartDate
    'Notice that because Category is an enumeration, the order of the items is the same as in the 
    'enumeration declaration
    listingDataView.SortDescriptions.Add(New SortDescription("Category", ListSortDirection.Ascending))
    listingDataView.SortDescriptions.Add(New SortDescription("StartDate", ListSortDirection.Ascending))
End Sub

FiltradoFiltering

Las vistas pueden aplicar también un filtro a una colección.Views can also apply a filter to a collection. Esto significa que aunque un elemento pueda existir en la colección, esta vista en concreto está destinada a mostrar únicamente determinado subconjunto de la colección completa.This means that although an item might exist in the collection, this particular view is intended to show only a certain subset of the full collection. Podría filtrar los datos en función de una condición.You might filter on a condition in the data. Por ejemplo, como se hace en la aplicación en la sección ¿Qué es el enlace de datos? , el "Mostrar solo CheckBox las ofertas" contiene la lógica para filtrar los elementos cuyo costo es de $25 o más.For instance, as is done by the application in the What Is Data Binding? section, the "Show only bargains" CheckBox contains logic to filter out items that cost $25 or more. El código siguiente se ejecuta para establecer ShowOnlyBargainsFilter como controlador Filter de CheckBox eventos cuando se selecciona:The following code is executed to set ShowOnlyBargainsFilter as the Filter event handler when that CheckBox is selected:

listingDataView.Filter += new FilterEventHandler(ShowOnlyBargainsFilter);
AddHandler listingDataView.Filter, AddressOf ShowOnlyBargainsFilter

El controlador de eventos ShowOnlyBargainsFilter se implementa del modo siguiente:The ShowOnlyBargainsFilter event handler has the following implementation:

private void ShowOnlyBargainsFilter(object sender, FilterEventArgs e)
{
    AuctionItem product = e.Item as AuctionItem;
    if (product != null)
    {
        // Filter out products with price 25 or above
        if (product.CurrentPrice < 25)
        {
            e.Accepted = true;
        }
        else
        {
            e.Accepted = false;
        }
    }
}
Private Sub ShowOnlyBargainsFilter(ByVal sender As Object, ByVal e As FilterEventArgs)
    Dim product As AuctionItem = CType(e.Item, AuctionItem)
    If Not (product Is Nothing) Then
        'Filter out products with price 25 or above
        If product.CurrentPrice < 25 Then
            e.Accepted = True
        Else
            e.Accepted = False
        End If
    End If
End Sub

Si usa una de las CollectionView clases directamente en lugar de CollectionViewSource, debe usar la Filter propiedad para especificar una devolución de llamada.If you are using one of the CollectionView classes directly instead of CollectionViewSource, you would use the Filter property to specify a callback. Para ver un ejemplo, consulte Filter Data in a View (Filtrado de datos en una vista).For an example, see Filter Data in a View.

AgruparGrouping

A excepción de la clase interna que ve IEnumerable una colección, todas las vistas de colección admiten la funcionalidad de la agrupación, lo que permite al usuario particionar la colección en la vista de colección en grupos lógicos.Except for the internal class that views an IEnumerable collection, all collection views support the functionality of grouping, which allows the user to partition the collection in the collection view into logical groups. Los grupos pueden ser explícitos, donde el usuario proporciona una lista de grupos, o implícitos, donde los grupos se generan dinámicamente en función de los datos.The groups can be explicit, where the user supplies a list of groups, or implicit, where the groups are generated dynamically depending on the data.

En el ejemplo siguiente se muestra la lógica de "agrupar por CheckBoxcategoría":The following example shows the logic of the "Group by category" CheckBox:

// This groups the items in the view by the property "Category"
PropertyGroupDescription groupDescription = new PropertyGroupDescription();
groupDescription.PropertyName = "Category";
listingDataView.GroupDescriptions.Add(groupDescription);
'This groups by property "Category"
Dim groupDescription As PropertyGroupDescription = New PropertyGroupDescription
groupDescription.PropertyName = "Category"
listingDataView.GroupDescriptions.Add(groupDescription)

Para obtener otro ejemplo de agrupación, consulte Group Items in a ListView That Implements a GridView (Agrupación de elementos en un control ListView que implemente un modo).For another grouping example, see Group Items in a ListView That Implements a GridView.

Punteros de elemento actualCurrent Item Pointers

Las vistas admiten también la noción de elemento actual.Views also support the notion of a current item. Puede navegar por los objetos en una vista de colección.You can navigate through the objects in a collection view. A medida que navega por los objetos, mueve un puntero de elemento que le permite recuperar el objeto ubicado concretamente en esa posición en la colección.As you navigate, you are moving an item pointer that allows you to retrieve the object that exists at that particular location in the collection. Para ver un ejemplo, consulte Navigate Through the Objects in a Data CollectionView (Desplazamiento por los objetos de una colección de datos mediante CollectionView).For an example, see Navigate Through the Objects in a Data CollectionView.

Dado que WPF solo se enlaza a una colección mediante una vista (una vista especificada por el usuario o la vista predeterminada de la colección), todos los enlaces a las colecciones tienen un puntero de elemento actual.Because WPF binds to a collection only by using a view (either a view you specify, or the collection's default view), all bindings to collections have a current item pointer. Al enlazar a una vista, el carácter de barra diagonal ("/") de un valor Path designa el elemento actual de la vista.When binding to a view, the slash ("/") character in a Path value designates the current item of the view. En el ejemplo siguiente, el contexto de datos es una vista de colección.In the following example, the data context is a collection view. La primera línea enlaza a la colección.The first line binds to the collection. La segunda línea enlaza al elemento actual de la colección.The second line binds to the current item in the collection. La tercera línea enlaza a la propiedad Description del elemento actual de la colección.The third line binds to the Description property of the current item in the collection.

<Button Content="{Binding }" />  
<Button Content="{Binding Path=/}" />  
<Button Content="{Binding Path=/Description}" />   

La sintaxis de barra diagonal y propiedad también puede apilarse para recorrer una jerarquía de colecciones.The slash and property syntax can also be stacked to traverse a hierarchy of collections. En el ejemplo siguiente se enlaza al elemento actual de una colección denominada Offices, que es una propiedad del elemento actual de la colección de origen.The following example binds to the current item of a collection named Offices, which is a property of the current item of the source collection.

<Button Content="{Binding /Offices/}" />  

Toda ordenación o filtrado que se aplique a la colección puede afectar al puntero del elemento actual.The current item pointer can be affected by any sorting or filtering that is applied to the collection. La ordenación conserva el puntero del elemento actual en el último elemento seleccionado, pero se reestructura la vista de colección a su alrededor.Sorting preserves the current item pointer on the last item selected, but the collection view is now restructured around it. (Quizás el elemento seleccionado estaba antes al principio de la lista, pero ahora puede que esté en alguna parte del medio). El filtrado conserva el elemento seleccionado si la selección permanece en la vista después del filtrado.(Perhaps the selected item was at the beginning of the list before, but now the selected item might be somewhere in the middle.) Filtering preserves the selected item if that selection remains in view after the filtering. De lo contrario, el puntero del elemento actual se establece en el primer elemento de la vista de colección filtrada.Otherwise, the current item pointer is set to the first item of the filtered collection view.

Escenario de enlace principal-detalleMaster-Detail Binding Scenario

La noción de elemento actual no es solo útil para la navegación de elementos en una colección, sino también para el escenario de enlace principal-detalle.The notion of a current item is useful not only for navigation of items in a collection, but also for the master-detail binding scenario. Considere de nuevo la IUUI de aplicación de la sección ¿Qué es el enlace de datos?.Consider the application IUUI in the What Is Data Binding? section again. En esa aplicación, la selección dentro ListBox de determina el contenido que se muestra ContentControlen.In that application, the selection within the ListBox determines the content shown in the ContentControl. Para colocarlo de otra forma, cuando se ListBox selecciona un elemento ContentControl , muestra los detalles del elemento seleccionado.To put it in another way, when a ListBox item is selected, the ContentControl shows the details of the selected item.

Puede implementar el escenario principal-detalle simplemente con dos o más controles enlazados a la misma vista.You can implement the master-detail scenario simply by having two or more controls bound to the same view. En el ejemplo siguiente de la demostración de enlace de datos se muestra ListBox el marcado ContentControl de y el que se IUUI ve en la aplicación en la sección ¿Qué es el enlace de datos? :The following example from the Data Binding Demo shows the markup of the ListBox and the ContentControl you see on the application IUUI in the What Is Data Binding? section:

<ListBox Name="Master" Grid.Row="2" Grid.ColumnSpan="3" Margin="8"
    ItemsSource="{Binding Source={StaticResource listingDataView}}">
</ListBox>
<ContentControl Name="Detail" Grid.Row="3" Grid.ColumnSpan="3" 
        Content="{Binding Source={StaticResource listingDataView}}" 
        ContentTemplate="{StaticResource detailsProductListingTemplate}" 
        Margin="9,0,0,0"/>

Observe que ambos controles están enlazados al mismo origen, el recurso estático listingDataView (consulte la definición de este recurso en la sección Creación de una vista).Notice that both of the controls are bound to the same source, the listingDataView static resource (see the definition of this resource in the How to Create a View section). Esto funciona porque cuando un objeto singleton ( ContentControl en este caso) está enlazado a una vista de colección, se enlaza automáticamente a la CurrentItem de la vista.This works because when a singleton object (the ContentControl in this case) is bound to a collection view, it automatically binds to the CurrentItem of the view. Tenga en CollectionViewSource cuenta que los objetos sincronizan automáticamente la moneda y la selección.Note that CollectionViewSource objects automatically synchronize currency and selection. Si el control de lista no está enlazado CollectionViewSource a un objeto como en este ejemplo, sería necesario establecer su IsSynchronizedWithCurrentItem propiedad en true para que funcione.If your list control is not bound to a CollectionViewSource object as in this example, then you would need to set its IsSynchronizedWithCurrentItem property to true for this to work.

Para obtener otros ejemplos, consulte Bind to a Collection and Display Information Based on Selection (Enlace de una colección y visualización de información según selección) y Use the Master-Detail Pattern with Hierarchical Data (Uso del patrón principal-detalle con datos jerárquicos).For other examples, see Bind to a Collection and Display Information Based on Selection and Use the Master-Detail Pattern with Hierarchical Data.

Tal vez haya observado que en el ejemplo anterior se utiliza una plantilla.You may have noticed that the above example uses a template. De hecho, los datos no se mostrarían tal ContentControl y como se deseaba sin el uso de plantillas (la que usaba explícitamente y la que usaba implícitamente el ListBox).In fact, the data would not be displayed the way we wish without the use of templates (the one explicitly used by the ContentControl and the one implicitly used by the ListBox). Trataremos el tema de la inclusión de datos en plantillas en la siguiente sección.We now turn to data templating in the next section.

Inclusión de datos en plantillasData Templating

Sin el uso de plantillas de datos, nuestra IUUI de aplicación de la sección ¿Qué es el enlace de datos? tendría este aspecto:Without the use of data templates, our application IUUI in the What Is Data Binding? section would look like the following:

Demo de enlace de datos sin plantillas de datos

Como se muestra en el ejemplo de la sección anterior, el ListBox control ContentControl y se enlazan al objeto de colección completo (o más concretamente, la vista sobre el objeto de colección) de AuctionItems.As shown in the example in the previous section, both the ListBox control and the ContentControl are bound to the entire collection object (or more specifically, the view over the collection object) of AuctionItems. Sin instrucciones específicas sobre cómo mostrar la recopilación de datos, el ListBox muestra una representación de cadena de cada objeto de la colección subyacente ContentControl y muestra una representación de cadena del objeto al que está enlazado.Without specific instructions of how to display the data collection, the ListBox is displaying a string representation of each object in the underlying collection and the ContentControl is displaying a string representation of the object it is bound to.

Para resolver ese problema, la aplicación define DataTemplates.To solve that problem, the application defines DataTemplates. Como se muestra en el ejemplo de la sección anterior, ContentControl el usa explícitamente detailsProductListingTemplateDataTemplate.As shown in the example in the previous section, the ContentControl explicitly uses the detailsProductListingTemplateDataTemplate. El ListBox control usa implícitamente lo siguiente DataTemplate al mostrar los objetos AuctionItem en la colección:The ListBox control implicitly uses the following DataTemplate when displaying the AuctionItem objects in the collection:

<DataTemplate DataType="{x:Type src:AuctionItem}">
    <Border BorderThickness="1" BorderBrush="Gray"
            Padding="7" Name="border" Margin="3" Width="500">
        <Grid>
          <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
          </Grid.RowDefinitions>
          <Grid.ColumnDefinitions>
            <ColumnDefinition Width="20"/>
            <ColumnDefinition Width="86"/>
            <ColumnDefinition Width="*"/>
          </Grid.ColumnDefinitions>
              
            <Polygon Grid.Row="0" Grid.Column="0" Grid.RowSpan="4"
                     Fill="Yellow" Stroke="Black" StrokeThickness="1"
                     StrokeLineJoin="Round" Width="20" Height="20"
                     Stretch="Fill"
                     Points="9,2 11,7 17,7 12,10 14,15 9,12 4,15 6,10 1,7 7,7"
                     Visibility="Hidden" Name="star"/>

            <TextBlock Grid.Row="0" Grid.Column="1" Margin="0,0,8,0"
                       Name="descriptionTitle"
                       Style="{StaticResource smallTitleStyle}">Description:</TextBlock>
            <TextBlock Name="DescriptionDTDataType" Grid.Row="0" Grid.Column="2" 
                Text="{Binding Path=Description}" 
                Style="{StaticResource textStyleTextBlock}"/>

            <TextBlock Grid.Row="1" Grid.Column="1" Margin="0,0,8,0"
                       Name="currentPriceTitle"
                       Style="{StaticResource smallTitleStyle}">Current Price:</TextBlock>
            <StackPanel Grid.Row="1" Grid.Column="2" Orientation="Horizontal">
                <TextBlock Text="$" Style="{StaticResource textStyleTextBlock}"/>
                <TextBlock Name="CurrentPriceDTDataType" 
                    Text="{Binding Path=CurrentPrice}" 
                    Style="{StaticResource textStyleTextBlock}"/>
            </StackPanel>
        </Grid>
    </Border>
    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding Path=SpecialFeatures}">
            <DataTrigger.Value>
                <src:SpecialFeatures>Color</src:SpecialFeatures>
            </DataTrigger.Value>
          <DataTrigger.Setters>
            <Setter Property="BorderBrush" Value="DodgerBlue" TargetName="border" />
            <Setter Property="Foreground" Value="Navy" TargetName="descriptionTitle" />
            <Setter Property="Foreground" Value="Navy" TargetName="currentPriceTitle" />
            <Setter Property="BorderThickness" Value="3" TargetName="border" />
            <Setter Property="Padding" Value="5" TargetName="border" />
          </DataTrigger.Setters>
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=SpecialFeatures}">
            <DataTrigger.Value>
                <src:SpecialFeatures>Highlight</src:SpecialFeatures>
            </DataTrigger.Value>
            <Setter Property="BorderBrush" Value="Orange" TargetName="border" />
            <Setter Property="Foreground" Value="Navy" TargetName="descriptionTitle" />
            <Setter Property="Foreground" Value="Navy" TargetName="currentPriceTitle" />
            <Setter Property="Visibility" Value="Visible" TargetName="star" />
            <Setter Property="BorderThickness" Value="3" TargetName="border" />
            <Setter Property="Padding" Value="5" TargetName="border" />
        </DataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>

Con el uso de estos dos DataTemplate, la interfaz de usuario resultante es la que se muestra en la sección ¿Qué es el enlace de datos? .With the use of those two DataTemplates, the resulting UI is the one shown in the What Is Data Binding? section. Como puede ver en la captura de pantalla, además de permitir colocar datos en los controles, DataTemplatelos s permiten definir objetos visuales atractivos para los datos.As you can see from that screenshot, in addition to letting you place data in your controls, DataTemplates allow you to define compelling visuals for your data. Por ejemplo, DataTriggerse usan en el anterior DataTemplate para que AuctionItems con el valor SpecialFeatures de resaltado se muestre con un borde naranja y una estrella.For example, DataTriggers are used in the above DataTemplate so that AuctionItems with SpecialFeatures value of HighLight would be displayed with an orange border and a star.

Para más información sobre las plantillas de datos, consulte Data Templating Overview (Introducción a las plantillas de datos).For more information about data templates, see the Data Templating Overview.

Validación de datosData Validation

La mayoría de las aplicaciones que toman datos proporcionados por el usuario requieren lógica de validación para asegurarse de que el usuario ha escrito la información esperada.Most applications that take user input need to have validation logic to ensure that the user has entered the expected information. Las comprobaciones de validación pueden basarse en el tipo, intervalo, formato u otros requisitos específicos de la aplicación.The validation checks can be based on type, range, format, or other application-specific requirements. En esta sección se describe cómo funciona la validación de datos en WPFWPF.This section discusses how data validation works in the WPFWPF.

Asociación de reglas de validación a un enlaceAssociating Validation Rules with a Binding

El WPFWPF modelo de enlace de datos permite asociar ValidationRules con Binding el objeto.The WPFWPF data binding model allows you to associate ValidationRules with your Binding object. Por ejemplo, en el ejemplo siguiente se enlaza TextBox un a una propiedad StartPrice denominada y se ExceptionValidationRule agrega un objeto Binding.ValidationRules a la propiedad.For example, the following example binds a TextBox to a property named StartPrice and adds a ExceptionValidationRule object to the Binding.ValidationRules property.

<TextBox Name="StartPriceEntryForm" Grid.Row="2" Grid.Column="1"
    Style="{StaticResource textStyleTextBox}" Margin="8,5,0,5">
  <TextBox.Text>
    <Binding Path="StartPrice" UpdateSourceTrigger="PropertyChanged">
      <Binding.ValidationRules>
        <ExceptionValidationRule />
      </Binding.ValidationRules>
    </Binding>
  </TextBox.Text>
</TextBox>

Un ValidationRule objeto comprueba si el valor de una propiedad es válido.A ValidationRule object checks whether the value of a property is valid. WPFWPFtiene los dos tipos siguientes de ValidationRule objetos integrados:has the following two types of built-in ValidationRule objects:

También puede crear su propia regla de validación derivando de la ValidationRule clase e implementando el Validate método.You can also create your own validation rule by deriving from the ValidationRule class and implementing the Validate method. En el ejemplo siguiente se muestra la regla que se usa en la sección ¿Qué es el enlace de datos? de Add Product Listing TextBox ?:The following example shows the rule used by the Add Product Listing "Start Date" TextBox from the What Is Data Binding? section:

class FutureDateRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        DateTime date;
        try
        {
            date = DateTime.Parse(value.ToString());
        }
        catch (FormatException)
        {
            return new ValidationResult(false, "Value is not a valid date.");
        }
        if (DateTime.Now.Date > date)
        {
            return new ValidationResult(false, "Please enter a date in the future.");
        }
        else
        {
            return ValidationResult.ValidResult;
        }
    }
}
Public Class FutureDateRule
    Inherits ValidationRule

    Public Overrides Function Validate(ByVal value As Object,
                                       ByVal cultureInfo As System.Globalization.CultureInfo) _
                                   As System.Windows.Controls.ValidationResult

        Dim DateVal As DateTime

        Try
            DateVal = DateTime.Parse(value.ToString)
        Catch ex As FormatException
            Return New ValidationResult(False, "Value is not a valid date.")
        End Try

        If DateTime.Now.Date > DateVal Then
            Return New ValidationResult(False, "Please enter a date in the future.")
        Else
            Return ValidationResult.ValidResult
        End If
    End Function
End Class

StartDateEntryFormTextBox usa este FutureDateRule, tal y como se muestra en el ejemplo siguiente:The StartDateEntryForm TextBox uses this FutureDateRule, as shown in the following example:

<TextBox Name="StartDateEntryForm" Grid.Row="3" Grid.Column="1" 
    Validation.ErrorTemplate="{StaticResource validationTemplate}" 
    Style="{StaticResource textStyleTextBox}" Margin="8,5,0,5">
    <TextBox.Text>
        <Binding Path="StartDate" UpdateSourceTrigger="PropertyChanged" 
            Converter="{StaticResource dateConverter}" >
            <Binding.ValidationRules>
                <src:FutureDateRule />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

Tenga en cuenta que UpdateSourceTrigger , dado PropertyChangedque el valor es, el motor de enlace actualiza el valor de origen en cada pulsación de tecla, ValidationRules lo que significa que también comprueba todas las reglas de la colección en cada pulsación de tecla.Note that because the UpdateSourceTrigger value is PropertyChanged, the binding engine updates the source value on every keystroke, which means it also checks every rule in the ValidationRules collection on every keystroke. Ofreceremos una descripción más detallada en la sección Proceso de validación.We discuss this further in the Validation Process section.

Proporcionar comentarios visualesProviding Visual Feedback

Si el usuario especifica un valor no válido, quizás desee proporcionar algunos comentarios sobre el error en la IUUI de aplicación.If the user enters an invalid value, you may want to provide some feedback about the error on the application IUUI. Una manera de proporcionar estos comentarios es establecer la Validation.ErrorTemplate propiedad adjunta en un personalizado. ControlTemplateOne way to provide such feedback is to set the Validation.ErrorTemplate attached property to a custom ControlTemplate. Tal y como se muestra en la subsección anterior, el ErrorTemplate StartDateEntryForm TextBox de uso utiliza un denominado validationTemplate.As shown in the previous subsection, the StartDateEntryForm TextBox uses an ErrorTemplate called validationTemplate. En el ejemplo siguiente se muestra la definición de validationTemplate:The following example shows the definition of validationTemplate:

<ControlTemplate x:Key="validationTemplate">
  <DockPanel>
    <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
    <AdornedElementPlaceholder/>
  </DockPanel>
</ControlTemplate>

El AdornedElementPlaceholder elemento especifica dónde se debe colocar el control que se va a adornar.The AdornedElementPlaceholder element specifies where the control being adorned should be placed.

Además, también puede usar un ToolTip para mostrar el mensaje de error.In addition, you may also use a ToolTip to display the error message. Tanto StartDateEntryForm como StartPriceEntryFormTextBoxusan el estilo textStyleTextBox, que crea un ToolTip que muestra el mensaje de error.Both the StartDateEntryForm and the StartPriceEntryFormTextBoxes use the style textStyleTextBox, which creates a ToolTip that displays the error message. En el ejemplo siguiente se muestra la definición de textStyleTextBox.The following example shows the definition of textStyleTextBox. La propiedad HasError adjunta es true cuando uno o varios de los enlaces de las propiedades del elemento enlazado son erróneos.The attached property HasError is true when one or more of the bindings on the properties of the bound element are in error.

<Style x:Key="textStyleTextBox" TargetType="TextBox">
  <Setter Property="Foreground" Value="#333333" />
  <Setter Property="MaxLength" Value="40" />
  <Setter Property="Width" Value="392" />
  <Style.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
      <Setter Property="ToolTip"
        Value="{Binding RelativeSource={RelativeSource Self},
                        Path=(Validation.Errors)[0].ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

Con el personalizado ErrorTemplate y el ToolTip, el StartDateEntryForm TextBox tiene un aspecto similar al siguiente cuando se produce un error de validación:With the custom ErrorTemplate and the ToolTip, the StartDateEntryForm TextBox looks like the following when there is a validation error:

Error de validación de enlace de datosData binding validation error

Si tiene reglas de validación asociadas pero no especifica un ErrorTemplate en el control enlazado, se usará un ErrorTemplate valor predeterminado para notificar a los usuarios cuando se produzca un error de validación. BindingIf your Binding has associated validation rules but you do not specify an ErrorTemplate on the bound control, a default ErrorTemplate will be used to notify users when there is a validation error. El valor ErrorTemplate predeterminado es una plantilla de control que define un borde rojo en la capa de adornos.The default ErrorTemplate is a control template that defines a red border in the adorner layer. Con los valores ErrorTemplate ToolTippredeterminados y IUUI , el de StartPriceEntryForm TextBox tiene un aspecto similar al siguiente cuando se produce un error de validación:With the default ErrorTemplate and the ToolTip, the IUUI of the StartPriceEntryForm TextBox looks like the following when there is a validation error:

Error de validación de enlace de datosData binding validation error

Para ver un ejemplo sobre cómo proporcionar lógica para validar todos los controles de un cuadro de diálogo, consulte la sección Cuadros de diálogo personalizados en Dialog Boxes Overview (Introducción a los cuadros de diálogo).For an example of how to provide logic to validate all controls in a dialog box, see the Custom Dialog Boxes section in the Dialog Boxes Overview.

Proceso de validaciónValidation Process

La validación normalmente se produce cuando el valor de un destino se transfiere a la propiedad de origen del enlace.Validation usually occurs when the value of a target is transferred to the binding source property. Esto sucede en TwoWay los OneWayToSource enlaces y.This occurs on TwoWay and OneWayToSource bindings. Para reiterar, lo que hace que una actualización de origen dependa del UpdateSourceTrigger valor de la propiedad, tal y como se describe en la sección qué desencadena las actualizaciones de origen .To reiterate, what causes a source update depends on the value of the UpdateSourceTrigger property, as described in the What Triggers Source Updates section.

A continuación se describe el proceso de validación.The following describes the validation process. Tenga en cuenta que si se produce un error de validación o de cualquier otro tipo en cualquier momento del proceso, este se detiene.Note that if a validation error or other type of error occurs at any time during this process, the process is halted.

  1. El motor de enlace comprueba si hay algún objeto ValidationRule personalizado definido cuyo ValidationStep está establecido en RawProposedValue para, Bindingen cuyo caso llama al Validate método en cada ValidationRule uno de ellos hasta que uno de ellos se ejecute en un error. o hasta que todos ellos pasan.The binding engine checks if there are any custom ValidationRule objects defined whose ValidationStep is set to RawProposedValue for that Binding, in which case it calls the Validate method on each ValidationRule until one of them runs into an error or until all of them pass.

  2. A continuación, el motor de enlace llama al convertidor, si existe alguno.The binding engine then calls the converter, if one exists.

  3. Si el convertidor se realiza correctamente, el motor de enlace comprueba si hay objetos ValidationRule personalizados definidos cuya ValidationStep propiedad está establecida ConvertedProposedValue en para Bindingeso, en cuyo caso llama al Validate método en cada ValidationRule uno de ellos. ValidationStep establezca enConvertedProposedValue hasta que uno de ellos se ejecute en un error o hasta que se superen todos.If the converter succeeds, the binding engine checks if there are any custom ValidationRule objects defined whose ValidationStep is set to ConvertedProposedValue for that Binding, in which case it calls the Validate method on each ValidationRule that has ValidationStep set to ConvertedProposedValue until one of them runs into an error or until all of them pass.

  4. El motor de enlace establece la propiedad de origen.The binding engine sets the source property.

  5. El motor de enlace comprueba si hay algún objeto ValidationRule personalizado definido cuyo ValidationStep Bindingestá establecido en UpdatedValue para, en cuyo caso llama al Validate método en cada ValidationRule que tiene ValidationStep establecido en. UpdatedValue hasta que uno de ellos se ejecute en un error o hasta que todos pasen.The binding engine checks if there are any custom ValidationRule objects defined whose ValidationStep is set to UpdatedValue for that Binding, in which case it calls the Validate method on each ValidationRule that has ValidationStep set to UpdatedValue until one of them runs into an error or until all of them pass. Si un DataErrorValidationRule está asociado a un enlace y su ValidationStep está establecido en DataErrorValidationRule el valor predeterminado UpdatedValue,, se comprueba en este punto.If a DataErrorValidationRule is associated with a binding and its ValidationStep is set to the default, UpdatedValue, the DataErrorValidationRule is checked at this point. También es el punto en el que se comprueban ValidatesOnDataErrors los enlaces true que tienen establecido en.This is also the point when bindings that have the ValidatesOnDataErrors set to true are checked.

  6. El motor de enlace comprueba si hay algún objeto ValidationRule personalizado definido cuyo ValidationStep Bindingestá establecido en CommittedValue para, en cuyo caso llama al Validate método en cada ValidationRule que tiene ValidationStep establecido en. CommittedValue hasta que uno de ellos se ejecute en un error o hasta que todos pasen.The binding engine checks if there are any custom ValidationRule objects defined whose ValidationStep is set to CommittedValue for that Binding, in which case it calls the Validate method on each ValidationRule that has ValidationStep set to CommittedValue until one of them runs into an error or until all of them pass.

Si no se pasa en ningún momento a lo largo de este proceso, el motor de ValidationError enlace crea un objeto y lo Errors agrega a la colección del elemento enlazado. ValidationRuleIf a ValidationRule does not pass at any time throughout this process, the binding engine creates a ValidationError object and adds it to the Errors collection of the bound element. Antes de que el motor de ValidationRule enlace ejecute los objetos en un paso determinado, ValidationError quita cualquier que se haya Errors agregado a la propiedad adjunta del elemento enlazado durante ese paso.Before the binding engine runs the ValidationRule objects at any given step, it removes any ValidationError that was added to the Errors attached property of the bound element during that step. Por ejemplo, si una ValidationRule cuya ValidationStep propiedad se establece UpdatedValue en failed, la próxima vez que se produzca el ValidationError proceso de validación, el motor de enlace quita ValidationRule inmediatamente antes ValidationStep de llamar a cualquier que tenga establecido en. UpdatedValue.For example, if a ValidationRule whose ValidationStep is set to UpdatedValue failed, the next time the validation process occurs, the binding engine removes that ValidationError immediately before it calls any ValidationRule that has ValidationStep set to UpdatedValue.

Cuando Errors no está vacío, la HasError propiedad adjunta del elemento se establece en true.When Errors is not empty, the HasError attached property of the element is set to true. Además, si la NotifyOnValidationError propiedad Binding de se establece en true, el motor de enlace genera el Validation.Error evento adjunto en el elemento.Also, if the NotifyOnValidationError property of the Binding is set to true, then the binding engine raises the Validation.Error attached event on the element.

Tenga en cuenta también que una transferencia de valor válida en cualquier dirección (destino a origen o origen a destino) Errors borra la propiedad adjunta.Also note that a valid value transfer in either direction (target to source or source to target) clears the Errors attached property.

Si el enlace ExceptionValidationRule tiene asociado o tiene la ValidatesOnExceptions propiedad establecida en true y se produce una excepción cuando el motor de enlace establece el origen, el motor de enlace comprueba para ver si hay un UpdateSourceExceptionFilter.If the binding either has an ExceptionValidationRule associated with it, or had the ValidatesOnExceptions property is set to true and an exception is thrown when the binding engine sets the source, the binding engine checks to see if there is a UpdateSourceExceptionFilter. Tiene la opción de usar la UpdateSourceExceptionFilter devolución de llamada para proporcionar un controlador personalizado para controlar excepciones.You have the option to use the UpdateSourceExceptionFilter callback to provide a custom handler for handling exceptions. Si no UpdateSourceExceptionFilter se especifica un Bindingen, el motor de enlace crea un ValidationError con la excepción y lo agrega a la Errors colección del elemento enlazado.If an UpdateSourceExceptionFilter is not specified on the Binding, the binding engine creates a ValidationError with the exception and adds it to the Errors collection of the bound element.

Mecanismo de depuraciónDebugging Mechanism

Puede establecer la propiedad TraceLevel adjunta en un objeto relacionado con el enlace para recibir información sobre el estado de un enlace concreto.You can set the attached property TraceLevel on a binding-related object to receive information about the status of a specific binding.

Vea tambiénSee also