Este tema aún no ha recibido ninguna valoración - Valorar este tema

BindingGroup (Clase)

Actualización: Julio de 2008

Contiene una colección de enlaces y objetos ValidationRule que se usan para validar un objeto.

Espacio de nombres:  System.Windows.Data
Ensamblado:  PresentationFramework (en PresentationFramework.dll)
XMLNS para XAML: http://schemas.microsoft.com/winfx/xaml/presentation
public class BindingGroup : DependencyObject
public class BindingGroup extends DependencyObject
public class BindingGroup extends DependencyObject

Un objeto BindingGroup crea una relación entre varios enlaces, que se pueden validar y actualizar juntos. Supongamos, por ejemplo, que una aplicación solicita al usuario que escriba una dirección. Después, la aplicación rellena un objeto de tipo Address, que tiene las propiedades Street, City, ZipCode y Country, con los valores que el usuario proporcionó. La aplicación tiene un panel que contiene cuatro controles TextBox, cada uno de los cuales mantiene un enlace a datos con una de las propiedades del objeto. Puede usar una regla ValidationRule en BindingGroup para validar el objeto Address. Si los enlaces participan del mismo BindingGroup, puede garantizar que el código postal sea válido para el país de la dirección.

Establezca la propiedad BindingGroup para FrameworkElement o FrameworkContentElement. Los elementos secundarios heredan BindingGroup de sus elementos primarios, al igual que ocurre con cualquier otra propiedad heredable. Un enlace en un elemento descendiente se agrega a BindingGroup si se da una de las siguientes situaciones:

En el ejemplo de la dirección, supongamos que la propiedad DataContext de Panel está establecida en el objeto de tipo Address. El enlace de cada TextBox se agrega al BindingGroup del panel.

Los objetos ValidationRule se agregan a un BindingGroup. BindingGroup se pasa como primer parámetro del método Validate cuando ValidationRule se ejecuta. Puede usar el método GetValue(Object, String) o TryGetValue 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 hacerlo por separado. Al llamar a uno de los métodos para validar los datos (ValidateWithoutUpdate, UpdateSources o CommitEdit), se valida y potencialmente se actualiza el enlace de cada TextBox del ejemplo. Cuando un enlace forma parte de un BindingGroup, el origen del enlace no se actualiza hasta que se llama al método UpdateSources o CommitEdit en el BindingGroup, a menos que establezca explícitamente la propiedad UpdateSourceTrigger.

En los ejemplos siguientes se crea una aplicación que pide al usuario que escriba la descripción y el precio de un artículo, así como la fecha en la que expira la oferta. La aplicación muestra la información actual sobre el artículo debajo del formulario. El usuario puede enviar o cancelar los cambios. Para obtener el ejemplo completo, vea Ejemplo Validate the Data of an Object.

La aplicación realiza lo siguiente para lograr este comportamiento.

  • Crea un objeto BindingGroup y le agrega el control StackPanel raíz cuando crea la interfaz de usuario (UI) de la aplicación. 

  • Llama a los métodos BeginEdit, CommitEdit y CancelEdit en la lógica de la aplicación para habilitar la capacidad de revertir los cambios.

  • Llama a TryGetValue en un método Validate para obtener la entrada del usuario y, a continuación, comprobar que hay un artículo de más de 100 dólares disponible al menos durante siete días.

En el ejemplo siguiente se crea la interfaz de usuario (UI) de la aplicación. El control StackPanel raíz tiene un objeto BindingGroup que contiene una regla ValidationRule que valida el artículo, como se ha descrito previamente. Los objetos de enlace de la propiedad Price y la propiedad OfferExpires pasan a formar parte del objeto BindingGroup y cada enlace tiene una regla ValidationRule que garantiza que el precio y la fecha, respectivamente, son valores válidos. Las reglas de validación de las propiedades individuales se ejecutan antes que la regla ValidationRule del objeto 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 de envío, la aplicación llama al método CommitEdit para ejecutar cada ValidationRule que está asociada al objeto BindingGroup. Si cada ValidationRule se ejecuta correctamente, el método CommitEdit guarda los valores en el objeto y finaliza la transacción de edición. Si el método CommitEdit se ejecuta correctamente, la aplicación comienza otra transacción de edición. Cuando se produce un error en la regla ValidationRule, se provoca el evento Validation.Error porque la aplicación estableció NotifyOnValidationError en true para el objeto BindingGroup (en el ejemplo anterior). ItemError controla el evento Validation.Error y muestra al usuario información sobre el error de validación. En el ejemplo también se controla el evento Loaded del control StackPanel y el evento Click del botón Cancelar.


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();
}



En el ejemplo siguiente se muestra la regla ValidationRule ValidateDateAndPrice personalizada, que se agregó al objeto BindingGroup en el primer ejemplo. La regla ValidationRule usa el objeto BindingGroup en su método Validate para obtener los valores que el usuario especificó en el formulario y comprueba que, si un artículo supera los 100 dólares, estará disponible al menos durante 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;

    }
}


Todos los miembros static (Shared en Visual Basic) públicos de este tipo son seguros para la ejecución de subprocesos. No se garantiza que los miembros de instancias sean seguros para la ejecución de subprocesos.

.NET Framework y .NET Compact Framework no admiten todas las versiones de cada plataforma. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.

.NET Framework

Compatible con: 3.5 SP1, 3.0 SP1

Fecha

Historial

Motivo

Julio de 2008

Se ha agregado un tema para la nueva clase.

Cambio de características de SP1.

¿Te ha resultado útil?
(Caracteres restantes: 1500)

Adiciones de comunidad

AGREGAR
© 2013 Microsoft. Reservados todos los derechos.