BindingGroup Classe

Definição

Contém uma coleção de associações e ValidationRule objetos que são usados para validar um objeto.

public ref class BindingGroup : System::Windows::DependencyObject
public class BindingGroup : System.Windows.DependencyObject
type BindingGroup = class
    inherit DependencyObject
Public Class BindingGroup
Inherits DependencyObject
Herança

Exemplos

Os exemplos a seguir criam um aplicativo que solicita que o usuário insira a descrição e o preço de um item e a data em que a oferta expira. O aplicativo exibe as informações atuais do item abaixo do formulário. O usuário pode enviar ou cancelar as alterações.

O aplicativo faz o seguinte para obter esse comportamento.

  • Cria um BindingGroup e adiciona a raiz StackPanel ao criar a interface do usuário do aplicativo.

  • Chama BeginEdit, CommitEdite CancelEdit na lógica do aplicativo para habilitar a reversão de alterações.

  • Chama TryGetValue em um Validate método para obter a entrada do usuário e, em seguida, marcar que um item acima de 100 dólares está disponível por pelo menos sete dias.

O exemplo a seguir cria a interface do usuário do aplicativo. A raiz StackPanel tem um BindingGroup que contém um ValidationRule que valida o item, conforme descrito anteriormente. Os objetos de associação na Price propriedade e na OfferExpires propriedade tornam-se parte do BindingGroup e cada associação tem um ValidationRule para garantir que o preço e a data, respectivamente, sejam valores válidos. As regras de validação para as propriedades individuais são executadas antes do ValidationRuleBindingGroupno .

<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>

O exemplo a seguir mostra os manipuladores de eventos para o aplicativo. Quando o usuário clica no botão Enviar, o aplicativo chama CommitEdit para executar cada ValidationRule um associado ao BindingGroup. Se cada um ValidationRule for bem-sucedido, CommitEdit salvará os valores no objeto e encerrará a transação de edição. Se CommitEdit for bem-sucedido, o aplicativo iniciará outra transação de edição. Quando um ValidationRule falha, o Validation.Error evento ocorre porque o aplicativo definido NotifyOnValidationErrortrue como no BindingGroup (no exemplo anterior). ItemError manipula o Validation.Error evento e exibe informações sobre o erro de validação para o usuário. O exemplo também manipula o Loaded evento para o StackPanel e o Click evento para o botão 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();
}

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

O exemplo a seguir mostra o personalizado ValidationRuleValidateDateAndPrice, que foi adicionado ao BindingGroup no primeiro exemplo. O ValidationRule usa o BindingGroup em seu Validate método para obter os valores inseridos pelo usuário no formulário e verifica se, se um item tiver mais de 100 dólares, ele ficará disponível por pelo menos sete dias.

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

Comentários

Um BindingGroup cria uma relação entre várias associações, que podem ser validadas e atualizadas juntas. Por exemplo, suponha que um aplicativo solicite que o usuário insira um endereço. Em seguida, o aplicativo preenche um objeto do tipo Address, que tem as propriedades , CityStreet, ZipCode, e Country, com os valores fornecidos pelo usuário. O aplicativo tem um painel que contém quatro TextBox controles, cada um deles associado a uma das propriedades do objeto. Você pode usar um ValidationRule em um BindingGroup para validar o Address objeto . Se as associações participarem do mesmo BindingGroup, você poderá garantir que o cep seja válido para o país/região do endereço.

Você define a BindingGroup propriedade em FrameworkElement ou FrameworkContentElement. Os elementos filho herdam o BindingGroup de seus elementos pai, assim como com qualquer outra propriedade herdável. Uma associação em um elemento descendente será adicionada a um BindingGroup se uma das seguintes situações ocorrer:

No exemplo do endereço, suponha que o DataContextPanel do seja definido como o objeto do tipo Address. A associação para cada TextBox é adicionada ao BindingGroup do painel.

Você adiciona ValidationRule objetos a um BindingGroup. O BindingGroup é passado como o primeiro parâmetro do Validate método quando o ValidationRule é executado. Você pode usar o TryGetValue método ou GetValue(Object, String) para BindingGroup obter os valores propostos do objeto e a Items propriedade para obter as fontes das associações.

Um BindingGroup atualiza as fontes da associação ao mesmo tempo em vez de cada associação ser atualizada separadamente. Quando você chama um dos métodos para validar os dados (ValidateWithoutUpdate, UpdateSourcesou CommitEdit), a associação para cada TextBox um no exemplo é validada e potencialmente atualizada. Quando uma associação faz parte de um BindingGroup, a origem da associação não é atualizada até que você chame UpdateSources ou CommitEdit no BindingGroup, a menos que você defina explicitamente a UpdateSourceTrigger propriedade .

Construtores

BindingGroup()

Inicializa uma nova instância da classe BindingGroup.

Propriedades

BindingExpressions

Obtém uma coleção de objetos BindingExpression que contém informações sobre cada associação no BindingGroup.

CanRestoreValues

Obtém se cada fonte na associação pode descartar as alterações pendentes e restaurar os valores originais.

DependencyObjectType

Obtém o DependencyObjectType que encapsula o tipo CLR dessa instância.

(Herdado de DependencyObject)
Dispatcher

Obtém o Dispatcher ao qual este DispatcherObject está associado.

(Herdado de DispatcherObject)
HasValidationError

Obtém um valor que indica se BindingGroup tem uma regra de validação com falha.

IsDirty

Obtém ou define um valor que indica se BindingGroup contém um valor proposto que não foi gravado na origem.

IsSealed

Obtém um valor que indica se essa instância está validada no momento (somente leitura).

(Herdado de DependencyObject)
Items

Obtém as fontes usadas pelos objetos de associação no BindingGroup.

Name

Obtém ou define o nome que identifica o BindingGroup, que pode ser usado para incluir e excluir objetos de associação no BindingGroup.

NotifyOnValidationError

Obtém ou define se o evento Error ocorre quando o estado de um ValidationRule é alterado.

Owner

Obtém o objeto ao qual este BindingGroup é atribuído.

SharesProposedValues

Obtém ou define um valor que indica se o BindingGroup reutiliza os valores de destino que não foram confirmados para a origem.

ValidatesOnNotifyDataError

Obtém ou define um valor que indica se a NotifyDataErrorValidationRule deve ser incluída.

ValidationErrors

Obtém uma coleção de objetos ValidationError que fizeram o BindingGroup ser inválido.

ValidationRules

Obtém uma coleção de objetos ValidationRule que validam os objetos de origem no BindingGroup.

Métodos

BeginEdit()

Inicia uma transação de edição nas fontes no BindingGroup.

CancelEdit()

Termina a transação de edição e descarta as alterações pendentes.

CheckAccess()

Determina se o thread de chamada tem acesso a este DispatcherObject.

(Herdado de DispatcherObject)
ClearValue(DependencyProperty)

Limpa o valor local de uma propriedade. A propriedade a ser limpa é especificada por um identificador DependencyProperty.

(Herdado de DependencyObject)
ClearValue(DependencyPropertyKey)

Limpa o valor local de uma propriedade somente leitura. A propriedade a ser limpa é especificada por um DependencyPropertyKey.

(Herdado de DependencyObject)
CoerceValue(DependencyProperty)

Converte o valor da propriedade de dependência especificada. Isso é feito invocando qualquer função CoerceValueCallback especificada nos metadados de propriedade para a propriedade de dependência, visto que ela existe na chamada a DependencyObject.

(Herdado de DependencyObject)
CommitEdit()

Executará todos os objetos ValidationRule e atualizará as fontes de associação, se todas as regras de validação tiverem sido bem-sucedidas.

Equals(Object)

Determina se um DependencyObject fornecido é equivalente ao DependencyObject atual.

(Herdado de DependencyObject)
GetHashCode()

Obtém o código hash para esse DependencyObject.

(Herdado de DependencyObject)
GetLocalValueEnumerator()

Cria um enumerador especializado para determinar quais propriedades de dependência têm valores definidos localmente nessa DependencyObject.

(Herdado de DependencyObject)
GetType()

Obtém o Type da instância atual.

(Herdado de Object)
GetValue(DependencyProperty)

Retorna o valor efetivo atual de uma propriedade de dependência nessa instância de um DependencyObject.

(Herdado de DependencyObject)
GetValue(Object, String)

Retorna o valor proposto para o item e a propriedade especificados.

InvalidateProperty(DependencyProperty)

Reavalia o valor efetivo para a propriedade de dependência especificada.

(Herdado de DependencyObject)
MemberwiseClone()

Cria uma cópia superficial do Object atual.

(Herdado de Object)
OnPropertyChanged(DependencyPropertyChangedEventArgs)

Invocado sempre que o valor efetivo de qualquer propriedade de dependência nesse DependencyObject for atualizado. A propriedade de dependência específica que mudou é relatada os dados do evento.

(Herdado de DependencyObject)
ReadLocalValue(DependencyProperty)

Retorna o valor local de uma propriedade de dependência, local, se houver.

(Herdado de DependencyObject)
SetCurrentValue(DependencyProperty, Object)

Define o valor da propriedade de dependência sem alterar a origem do valor.

(Herdado de DependencyObject)
SetValue(DependencyProperty, Object)

Define o valor local de uma propriedade de dependência, especificada pelo identificador da propriedade de dependência.

(Herdado de DependencyObject)
SetValue(DependencyPropertyKey, Object)

Define o valor de uma propriedade de dependência somente leitura, especificada pelo identificador DependencyPropertyKey da propriedade de dependência.

(Herdado de DependencyObject)
ShouldSerializeProperty(DependencyProperty)

Retorna um valor que indica se os processos de serialização devem serializar o valor da propriedade de dependência fornecida.

(Herdado de DependencyObject)
ToString()

Retorna uma cadeia de caracteres que representa o objeto atual.

(Herdado de Object)
TryGetValue(Object, String, Object)

Tenta obter o valor proposto para a propriedade e o item especificados.

UpdateSources()

Executará o conversor na associação e nos objetos ValidationRule que têm a propriedade ValidationStep definida como RawProposedValue, ConvertedProposedValue ou UpdatedValue e salvará os valores dos destinos para os objetos de origem se todas as regras de validação tiverem sido bem-sucedidas.

ValidateWithoutUpdate()

Executa o conversor na associação e nos objetos ValidationRule que têm a propriedade ValidationStep definida como RawProposedValue ou ConvertedProposedValue.

VerifyAccess()

Impõe que o thread de chamada tenha acesso a este DispatcherObject.

(Herdado de DispatcherObject)

Aplica-se a