BindingGroup Clase
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Contiene una colección de enlaces y ValidationRule objetos que se usan para validar un objeto.
public ref class BindingGroup : System::Windows::DependencyObject
public class BindingGroup : System.Windows.DependencyObject
type BindingGroup = class
inherit DependencyObject
Public Class BindingGroup
Inherits DependencyObject
- Herencia
Ejemplos
En los ejemplos siguientes se crea una aplicación que solicita al usuario que escriba la descripción y el precio de un artículo y la fecha en que expira la oferta. La aplicación muestra la información actual del elemento debajo del formulario. El usuario puede enviar o cancelar los cambios.
La aplicación hace lo siguiente para lograr este comportamiento.
Crea un BindingGroup y lo agrega el StackPanel raíz cuando crea la interfaz de usuario (UI) de la aplicación.
Llama a BeginEdit, CommitEdity CancelEdit en la lógica de la aplicación para permitir la revierte los cambios.
Llama a TryGetValue en un método de Validate para obtener la entrada del usuario y, a continuación, comprobar que un elemento de más de 100 dólares está disponible durante al menos siete días.
En el ejemplo siguiente se crea la interfaz de usuario (UI) de la aplicación. El StackPanel raíz tiene un BindingGroup que contiene un ValidationRule que valida el elemento, como se ha descrito anteriormente. Los objetos de enlace de la propiedad Price
y la propiedad OfferExpires
forman parte del BindingGroup y cada enlace tiene un ValidationRule para asegurarse de que el precio y la fecha, respectivamente, son valores válidos. Las reglas de validación de las propiedades individuales se ejecutan antes de la ValidationRule en el BindingGroup.
<StackPanel Name="stackPanel1" Margin="10" Width="250"
Loaded="stackPanel1_Loaded"
Validation.Error="ItemError">
<StackPanel.Resources>
<Style TargetType="HeaderedContentControl">
<Setter Property="Margin" Value="2"/>
<Setter Property="Focusable" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="HeaderedContentControl">
<DockPanel LastChildFill="False">
<ContentPresenter ContentSource="Header" DockPanel.Dock="Left" Focusable="False" VerticalAlignment="Center"/>
<ContentPresenter ContentSource="Content" Margin="5,0,0,0" DockPanel.Dock="Right" VerticalAlignment="Center"/>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="Button">
<Setter Property="Width" Value="100"/>
<Setter Property="Margin" Value="10,15,15,15"/>
</Style>
</StackPanel.Resources>
<StackPanel.BindingGroup>
<BindingGroup NotifyOnValidationError="True">
<BindingGroup.ValidationRules>
<src:ValidateDateAndPrice ValidationStep="ConvertedProposedValue" />
</BindingGroup.ValidationRules>
</BindingGroup>
</StackPanel.BindingGroup>
<TextBlock FontSize="14" Text="Enter an item for sale"/>
<HeaderedContentControl Header="Description">
<TextBox Width="150" Text="{Binding Path=Description, Mode=TwoWay}"/>
</HeaderedContentControl>
<HeaderedContentControl Header="Price">
<TextBox Name="priceField" Width="150">
<TextBox.Text>
<Binding Path="Price" Mode="TwoWay" >
<Binding.ValidationRules>
<src:PriceIsAPositiveNumber/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
</HeaderedContentControl>
<HeaderedContentControl Header="Date Offer Ends">
<TextBox Name="dateField" Width="150" >
<TextBox.Text>
<Binding Path="OfferExpires" StringFormat="d" >
<Binding.ValidationRules>
<src:FutureDateRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
</HeaderedContentControl>
<StackPanel Orientation="Horizontal">
<Button IsDefault="True" Click="Submit_Click">_Submit</Button>
<Button IsCancel="True" Click="Cancel_Click">_Cancel</Button>
</StackPanel>
<HeaderedContentControl Header="Description">
<TextBlock Width="150" Text="{Binding Path=Description}"/>
</HeaderedContentControl>
<HeaderedContentControl Header="Price">
<TextBlock Width="150" Text="{Binding Path=Price, StringFormat=c}"/>
</HeaderedContentControl>
<HeaderedContentControl Header="Date Offer Ends">
<TextBlock Width="150" Text="{Binding Path=OfferExpires, StringFormat=d}"/>
</HeaderedContentControl>
</StackPanel>
En el ejemplo siguiente se muestran los controladores de eventos de la aplicación. Cuando el usuario hace clic en el botón Enviar, la aplicación llama a CommitEdit para ejecutar cada ValidationRule asociado al BindingGroup. Si cada ValidationRule se realiza correctamente, CommitEdit guarda los valores en el objeto y finaliza la transacción de edición. Si CommitEdit se realiza correctamente, la aplicación inicia otra transacción de edición. Cuando se produce un error en un ValidationRule, el evento Validation.Error se produce porque la aplicación estableció NotifyOnValidationError en true
en el BindingGroup (en el ejemplo anterior).
ItemError
controla el evento Validation.Error y muestra información sobre el error de validación al usuario. En el ejemplo también se controla el evento
private void Submit_Click(object sender, RoutedEventArgs e)
{
if (stackPanel1.BindingGroup.CommitEdit())
{
MessageBox.Show("Item submitted");
stackPanel1.BindingGroup.BeginEdit();
}
}
// This event occurs when a ValidationRule in the BindingGroup
// or in a Binding fails.
private void ItemError(object sender, ValidationErrorEventArgs e)
{
if (e.Action == ValidationErrorEventAction.Added)
{
MessageBox.Show(e.Error.ErrorContent.ToString());
}
}
void stackPanel1_Loaded(object sender, RoutedEventArgs e)
{
// Set the DataContext to a PurchaseItem object.
// The BindingGroup and Binding objects use this as
// the source.
stackPanel1.DataContext = new PurchaseItem();
// Begin an edit transaction that enables
// the object to accept or roll back changes.
stackPanel1.BindingGroup.BeginEdit();
}
private void Cancel_Click(object sender, RoutedEventArgs e)
{
// Cancel the pending changes and begin a new edit transaction.
stackPanel1.BindingGroup.CancelEdit();
stackPanel1.BindingGroup.BeginEdit();
}
Private Sub Submit_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
If stackPanel1.BindingGroup.CommitEdit() Then
MessageBox.Show("Item submitted")
stackPanel1.BindingGroup.BeginEdit()
End If
End Sub
' This event occurs when a ValidationRule in the BindingGroup
' or in a Binding fails.
Private Sub ItemError(ByVal sender As Object, ByVal e As ValidationErrorEventArgs)
If e.Action = ValidationErrorEventAction.Added Then
MessageBox.Show(e.Error.ErrorContent.ToString())
End If
End Sub
Private Sub stackPanel1_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs)
' Set the DataContext to a PurchaseItem object.
' The BindingGroup and Binding objects use this as
' the source.
stackPanel1.DataContext = New PurchaseItem()
' Begin an edit transaction that enables
' the object to accept or roll back changes.
stackPanel1.BindingGroup.BeginEdit()
End Sub
Private Sub Cancel_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
' Cancel the pending changes and begin a new edit transaction.
stackPanel1.BindingGroup.CancelEdit()
stackPanel1.BindingGroup.BeginEdit()
End Sub
En el ejemplo siguiente se muestra el ValidationRuleValidateDateAndPrice
personalizado , que se agregó al BindingGroup en el primer ejemplo. El ValidationRule usa el BindingGroup en su método Validate para obtener los valores que el usuario escribió en el formulario y comprueba que si un elemento es superior a 100 dólares, estará disponible durante al menos siete días.
public class ValidateDateAndPrice : ValidationRule
{
// Ensure that an item over $100 is available for at least 7 days.
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
BindingGroup bg = value as BindingGroup;
// Get the source object.
PurchaseItem item = bg.Items[0] as PurchaseItem;
object doubleValue;
object dateTimeValue;
// Get the proposed values for Price and OfferExpires.
bool priceResult = bg.TryGetValue(item, "Price", out doubleValue);
bool dateResult = bg.TryGetValue(item, "OfferExpires", out dateTimeValue);
if (!priceResult || !dateResult)
{
return new ValidationResult(false, "Properties not found");
}
double price = (double)doubleValue;
DateTime offerExpires = (DateTime)dateTimeValue;
// Check that an item over $100 is available for at least 7 days.
if (price > 100)
{
if (offerExpires < DateTime.Today + new TimeSpan(7, 0, 0, 0))
{
return new ValidationResult(false, "Items over $100 must be available for at least 7 days.");
}
}
return ValidationResult.ValidResult;
}
}
Public Class ValidateDateAndPrice
Inherits ValidationRule
' Ensure that an item over $100 is available for at least 7 days.
Public Overrides Function Validate(ByVal value As Object, ByVal cultureInfo As CultureInfo) As ValidationResult
Dim bg As BindingGroup = TryCast(value, BindingGroup)
' Get the source object.
Dim item As PurchaseItem = TryCast(bg.Items(0), PurchaseItem)
Dim doubleValue As Object = Nothing
Dim dateTimeValue As Object = Nothing
' Get the proposed values for Price and OfferExpires.
Dim priceResult As Boolean = bg.TryGetValue(item, "Price", doubleValue)
Dim dateResult As Boolean = bg.TryGetValue(item, "OfferExpires", dateTimeValue)
If (Not priceResult) OrElse (Not dateResult) Then
Return New ValidationResult(False, "Properties not found")
End If
Dim price As Double = CDbl(doubleValue)
Dim offerExpires As Date = CDate(dateTimeValue)
' Check that an item over $100 is available for at least 7 days.
If price > 100 Then
If offerExpires < Date.Today + New TimeSpan(7, 0, 0, 0) Then
Return New ValidationResult(False, "Items over $100 must be available for at least 7 days.")
End If
End If
Return ValidationResult.ValidResult
End Function
End Class
Comentarios
Un BindingGroup crea una relación entre varios enlaces, que se pueden validar y actualizar juntos. Por ejemplo, supongamos que una aplicación pide al usuario que escriba una dirección. A continuación, la aplicación rellena un objeto de tipo Address
, que tiene las propiedades, Street
, City
, ZipCode
y Country
, con los valores proporcionados por el usuario. La aplicación tiene un panel que contiene cuatro controles TextBox, cada uno de los cuales está enlazado a una de las propiedades del objeto. Puede usar un ValidationRule en un BindingGroup para validar el objeto Address
. Si los enlaces participan en la misma BindingGroup, puede asegurarse de que el código postal es válido para el país o región de la dirección.
Establezca la propiedad BindingGroup en FrameworkElement o FrameworkContentElement. Los elementos secundarios heredan el BindingGroup de sus elementos primarios, igual que con cualquier otra propiedad heredable. Un enlace en un elemento descendiente se agrega a un BindingGroup si se produce una de las situaciones siguientes:
El origen del enlace y el DataContext del elemento que tiene el BindingGroup son el mismo objeto y no se establece la propiedad BindingGroupName.
La propiedad BindingGroupName del enlace es igual al Name del BindingGroup y no se establecen explícitamente en
null
.
En el ejemplo de la dirección, supongamos que el DataContext del Panel se establece en el objeto de tipo Address
. El enlace de cada TextBox se agrega al BindingGroup del panel.
Agregue ValidationRule objetos a un BindingGroup. El BindingGroup se pasa como primer parámetro del método Validate cuando se ejecuta el ValidationRule. Puede usar el método TryGetValue o GetValue(Object, String) en ese BindingGroup para obtener los valores propuestos del objeto y la propiedad Items para obtener los orígenes de los enlaces.
Un BindingGroup actualiza los orígenes del enlace al mismo tiempo en lugar de que cada enlace se actualiza por separado. Cuando se llama a uno de los métodos para validar los datos (ValidateWithoutUpdate, UpdateSourceso CommitEdit), el enlace para cada TextBox del ejemplo se valida y se actualiza potencialmente. Cuando un enlace forma parte de un BindingGroup, el origen del enlace no se actualiza hasta que se llama a UpdateSources o CommitEdit en el BindingGroup, a menos que establezca explícitamente la propiedad UpdateSourceTrigger.
Constructores
BindingGroup() |
Inicializa una nueva instancia de la clase BindingGroup. |
Propiedades
BindingExpressions |
Obtiene una colección de objetos BindingExpression que contiene información para cada enlace en el BindingGroup. |
CanRestoreValues |
Obtiene si cada origen del enlace puede descartar los cambios pendientes y restaurar los valores originales. |
DependencyObjectType |
Obtiene el DependencyObjectType que encapsula el tipo CLR de esta instancia. (Heredado de DependencyObject) |
Dispatcher |
Obtiene el Dispatcher al que está asociado este DispatcherObject. (Heredado de DispatcherObject) |
HasValidationError |
Obtiene un valor que indica si el BindingGroup tiene una regla de validación errónea. |
IsDirty |
Obtiene o establece un valor que indica si el BindingGroup contiene un valor propuesto que no se ha escrito en el origen. |
IsSealed |
Obtiene un valor que indica si esta instancia está actualmente sellada (solo lectura). (Heredado de DependencyObject) |
Items |
Obtiene los orígenes utilizados por los objetos Binding en el BindingGroup. |
Name |
Obtiene o establece el nombre que identifica el BindingGroup, que se puede usar para incluir y excluir objetos Binding en el BindingGroup. |
NotifyOnValidationError |
Obtiene o establece si el evento Error se produce cuando cambia el estado de un ValidationRule. |
Owner |
Obtiene el objeto al que se asigna este BindingGroup. |
SharesProposedValues |
Obtiene o establece un valor que indica si el BindingGroup reutiliza los valores de destino que no se han confirmado en el origen. |
ValidatesOnNotifyDataError |
Obtiene o establece un valor que indica si se debe incluir el NotifyDataErrorValidationRule. |
ValidationErrors |
Obtiene una colección de objetos ValidationError que provocaron que el BindingGroup no sea válido. |
ValidationRules |
Obtiene una colección de objetos ValidationRule que validan los objetos de origen en el BindingGroup. |
Métodos
BeginEdit() |
Inicia una transacción de edición en los orígenes de la BindingGroup. |
CancelEdit() |
Finaliza la transacción de edición y descarta los cambios pendientes. |
CheckAccess() |
Determina si el subproceso que llama tiene acceso a este DispatcherObject. (Heredado de DispatcherObject) |
ClearValue(DependencyProperty) |
Borra el valor local de una propiedad. El identificador de DependencyProperty especifica la propiedad que se va a borrar. (Heredado de DependencyObject) |
ClearValue(DependencyPropertyKey) |
Borra el valor local de una propiedad de solo lectura. Un DependencyPropertyKeyespecifica la propiedad que se va a borrar. (Heredado de DependencyObject) |
CoerceValue(DependencyProperty) |
Coerce el valor de la propiedad de dependencia especificada. Esto se logra invocando cualquier función de CoerceValueCallback especificada en metadatos de propiedad para la propiedad de dependencia tal como existe en la llamada a DependencyObject. (Heredado de DependencyObject) |
CommitEdit() |
Ejecuta todos los objetos ValidationRule y actualiza los orígenes de enlace si todas las reglas de validación se realizan correctamente. |
Equals(Object) |
Determina si un DependencyObject proporcionado es equivalente al DependencyObjectactual. (Heredado de DependencyObject) |
GetHashCode() |
Obtiene un código hash para este DependencyObject. (Heredado de DependencyObject) |
GetLocalValueEnumerator() |
Crea un enumerador especializado para determinar qué propiedades de dependencia tienen valores establecidos localmente en este DependencyObject. (Heredado de DependencyObject) |
GetType() |
Obtiene el Type de la instancia actual. (Heredado de Object) |
GetValue(DependencyProperty) |
Devuelve el valor efectivo actual de una propiedad de dependencia en esta instancia de un DependencyObject. (Heredado de DependencyObject) |
GetValue(Object, String) |
Devuelve el valor propuesto para la propiedad y el elemento especificados. |
InvalidateProperty(DependencyProperty) |
Vuelve a evaluar el valor efectivo de la propiedad de dependencia especificada. (Heredado de DependencyObject) |
MemberwiseClone() |
Crea una copia superficial del Objectactual. (Heredado de Object) |
OnPropertyChanged(DependencyPropertyChangedEventArgs) |
Se invoca cada vez que se ha actualizado el valor efectivo de cualquier propiedad de dependencia en este DependencyObject. La propiedad de dependencia específica que cambió se notifica en los datos del evento. (Heredado de DependencyObject) |
ReadLocalValue(DependencyProperty) |
Devuelve el valor local de una propiedad de dependencia, si existe. (Heredado de DependencyObject) |
SetCurrentValue(DependencyProperty, Object) |
Establece el valor de una propiedad de dependencia sin cambiar su origen de valor. (Heredado de DependencyObject) |
SetValue(DependencyProperty, Object) |
Establece el valor local de una propiedad de dependencia, especificado por su identificador de propiedad de dependencia. (Heredado de DependencyObject) |
SetValue(DependencyPropertyKey, Object) |
Establece el valor local de una propiedad de dependencia de solo lectura, especificada por el identificador DependencyPropertyKey de la propiedad de dependencia. (Heredado de DependencyObject) |
ShouldSerializeProperty(DependencyProperty) |
Devuelve un valor que indica si los procesos de serialización deben serializar el valor de la propiedad de dependencia proporcionada. (Heredado de DependencyObject) |
ToString() |
Devuelve una cadena que representa el objeto actual. (Heredado de Object) |
TryGetValue(Object, String, Object) |
Intenta obtener el valor propuesto para la propiedad y el elemento especificados. |
UpdateSources() |
Ejecuta el convertidor en el enlace y los objetos ValidationRule que tienen la propiedad ValidationStep establecida en RawProposedValue, ConvertedProposedValueo UpdatedValue y guarda los valores de los destinos en los objetos de origen si todas las reglas de validación se realizan correctamente. |
ValidateWithoutUpdate() |
Ejecuta el convertidor en el enlace y los objetos ValidationRule que tienen la propiedad ValidationStep establecida en RawProposedValue o ConvertedProposedValue. |
VerifyAccess() |
Exige que el subproceso de llamada tenga acceso a este DispatcherObject. (Heredado de DispatcherObject) |