Compartilhar via


BindingGroup Classe

Definição

Contém uma coleção de associações e objetos ValidationRule 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 o StackPanel raiz ao criar a interface do usuário do aplicativo.

  • Chama BeginEdit, CommitEdite CancelEdit na lógica do aplicativo para habilitar alterações reversivas.

  • Chamadas TryGetValue em um método Validate para obter a entrada do usuário e, em seguida, verificar se 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. O StackPanel raiz tem um BindingGroup que contém um ValidationRule que valida o item, conforme descrito anteriormente. Os objetos de associação na propriedade Price e na propriedade OfferExpires 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 ValidationRule no 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>

O exemplo a seguir mostra os manipuladores de eventos do aplicativo. Quando o usuário clica no botão Enviar, o aplicativo chama CommitEdit para executar cada ValidationRule associado ao BindingGroup. Se cada 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 evento Validation.Error ocorre porque o conjunto de aplicativos NotifyOnValidationError para true no BindingGroup (no exemplo anterior). ItemError manipula o evento Validation.Error e exibe informações sobre o erro de validação para o usuário. O exemplo também manipula o evento Loaded para o StackPanel e o evento Click 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 ValidationRuleValidateDateAndPricepersonalizado, que foi adicionado à BindingGroup no primeiro exemplo. O ValidationRule usa o BindingGroup em seu método Validate para obter os valores inseridos pelo usuário no formulário e verifica se um item tem 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 popula um objeto do tipo Address, que tem as propriedades, Street, City, ZipCodee Country, com os valores fornecidos pelo usuário. O aplicativo tem um painel que contém quatro controles TextBox, cada um deles associado a uma das propriedades do objeto. Você pode usar um ValidationRule em um BindingGroup para validar o objeto Address. 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 propriedade BindingGroup em FrameworkElement ou FrameworkContentElement. Elementos filho herdam a BindingGroup de seus elementos pai, assim como com qualquer outra propriedade herdável. Uma associação em um elemento descendente é adicionada a um BindingGroup se ocorrer uma das seguintes situações:

No exemplo do endereço, suponha que o DataContext do Panel esteja definido como o objeto do tipo Address. A associação para cada TextBox é adicionada à BindingGroup do painel.

Você adiciona objetos ValidationRule a um BindingGroup. O BindingGroup é passado como o primeiro parâmetro do método Validate quando o ValidationRule é executado. Você pode usar o método TryGetValue ou GetValue(Object, String) nesse BindingGroup para obter os valores propostos do objeto e a propriedade Items 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 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 propriedade UpdateSourceTrigger.

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 para cada Associação no BindingGroup.

CanRestoreValues

Obtém se cada fonte na associação pode descartar 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 esse DispatcherObject está associado.

(Herdado de DispatcherObject)
HasValidationError

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

IsDirty

Obtém ou define um valor que indica se o 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á lacrada no momento (somente leitura).

(Herdado de DependencyObject)
Items

Obtém as fontes usadas pelos objetos Binding no BindingGroup.

Name

Obtém ou define o nome que identifica o BindingGroup, que pode ser usado para incluir e excluir objetos binding 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 esse BindingGroup está atribuído.

SharesProposedValues

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

ValidatesOnNotifyDataError

Obtém ou define um valor que indica se o NotifyDataErrorValidationRuledeve ser incluído.

ValidationErrors

Obtém uma coleção de objetos ValidationError que fizeram com que o BindingGroup fosse 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()

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

CheckAccess()

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

(Herdado de DispatcherObject)
ClearValue(DependencyProperty)

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

(Herdado de DependencyObject)
ClearValue(DependencyPropertyKey)

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

(Herdado de DependencyObject)
CoerceValue(DependencyProperty)

Coagi o valor da propriedade de dependência especificada. Isso é feito invocando qualquer função de CoerceValueCallback especificada em metadados de propriedade para a propriedade de dependência como ela existe na chamada DependencyObject.

(Herdado de DependencyObject)
CommitEdit()

Executa todos os objetos ValidationRule e atualiza as fontes de associação se todas as regras de validação forem bem-sucedidas.

Equals(Object)

Determina se um DependencyObject fornecido é equivalente ao DependencyObjectatual.

(Herdado de DependencyObject)
GetHashCode()

Obtém um código hash para este DependencyObject.

(Herdado de DependencyObject)
GetLocalValueEnumerator()

Cria um enumerador especializado para determinar quais propriedades de dependência têm valores definidos localmente neste 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 nesta instância de um DependencyObject.

(Herdado de DependencyObject)
GetValue(Object, String)

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

InvalidateProperty(DependencyProperty)

Reavalia o valor efetivo da propriedade de dependência especificada.

(Herdado de DependencyObject)
MemberwiseClone()

Cria uma cópia superficial do Objectatual.

(Herdado de Object)
OnPropertyChanged(DependencyPropertyChangedEventArgs)

Invocado sempre que o valor efetivo de qualquer propriedade de dependência neste DependencyObject for atualizado. A propriedade de dependência específica que foi alterada é relatada nos dados do evento.

(Herdado de DependencyObject)
ReadLocalValue(DependencyProperty)

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

(Herdado de DependencyObject)
SetCurrentValue(DependencyProperty, Object)

Define o valor de uma propriedade de dependência sem alterar sua fonte de valor.

(Herdado de DependencyObject)
SetValue(DependencyProperty, Object)

Define o valor local de uma propriedade de dependência, especificada por seu identificador de propriedade de dependência.

(Herdado de DependencyObject)
SetValue(DependencyPropertyKey, Object)

Define o valor local 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()

Executa o conversor na associação e nos objetos ValidationRule que têm a propriedade ValidationStep definida como RawProposedValue, ConvertedProposedValueou UpdatedValue e salva os valores dos destinos nos objetos de origem se todas as regras de validação forem 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 esse DispatcherObject.

(Herdado de DispatcherObject)

Aplica-se a