BindingGroup Classe

Definição

Contém uma coleção de ligaçõ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 seguintes criam uma aplicação que pede ao utilizador que introduza a descrição e o preço de um artigo e a data de expiração da oferta. A aplicação apresenta a informação atual do item abaixo do formulário. O utilizador pode submeter ou cancelar as alterações.

A aplicação faz o seguinte para alcançar este comportamento.

  • Cria um BindingGroup e adiciona-o como raiz StackPanel quando cria a interface de utilizador (UI) da aplicação.

  • Chama BeginEdit, CommitEdit, e CancelEdit na lógica da aplicação para permitir reverter alterações.

  • Chama TryGetValue um Validate método para obter a opinião do utilizador e depois verifica se um item acima de 100 dólares está disponível durante pelo menos sete dias.

O exemplo seguinte cria a interface de utilizador (UI) da aplicação. A raiz StackPanel tem um BindingGroup que contém um ValidationRule que valida o item, como descrito anteriormente. Os objetos de ligação na Price propriedade e a OfferExpires propriedade tornam-se parte do BindingGroup e cada ligação tem um ValidationRule para garantir que preço e data, respetivamente, são valores válidos. As regras de validação para as propriedades individuais correm antes do ValidationRule em .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 seguinte mostra os gestores de eventos da aplicação. Quando o utilizador clica no botão Enviar, a aplicação chama CommitEdit para executar cada um ValidationRule que está associado ao BindingGroup. Se cada um ValidationRule tiver sucesso, CommitEdit os valores são guardados no objeto e termina a transação de edição. Se CommitEdit for bem-sucedida, a candidatura inicia outra transação de edição. Quando um ValidationRule falha, o Validation.Error evento ocorre porque a aplicação define NotifyOnValidationError para true em ( BindingGroup no exemplo anterior). ItemError gere o Validation.Error evento e apresenta informações sobre o erro de validação ao utilizador. O exemplo também trata do Loaded evento para o StackPanel e do Click evento do 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 seguinte mostra o costume ValidationRuleValidateDateAndPrice, que foi adicionado ao BindingGroup no primeiro exemplo. Utiliza ValidationRule o BindingGroup no seu Validate método para obter os valores inseridos pelo utilizador no formulário e verifica que, se um item for superior a 100 dólares, estará 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

Observações

A BindingGroup cria uma relação entre múltiplas ligações, que podem ser validadas e atualizadas em conjunto. Por exemplo, suponha que uma aplicação solicita ao utilizador que introduza um endereço. A aplicação preenche então um objeto do tipo Address, que tem as propriedades , StreetCity, ZipCode, e Country, com os valores fornecidos pelo utilizador. A aplicação tem um painel que contém quatro TextBox controlos, cada um dos quais está ligado a uma das propriedades do objeto. Podes usar um ValidationRule in a BindingGroup para validar o Address objeto. Se as ligações participarem da mesma BindingGroupforma, pode garantir que o código postal é válido para o país/região do endereço.

Define a BindingGroup propriedade em FrameworkElement ou FrameworkContentElement. Os elementos filhos herdam o BindingGroup dos seus elementos progenitores, tal como acontece com qualquer outra propriedade herdável. Uma ligação a um elemento descendente é adicionada a BindingGroup se ocorrer uma das seguintes situações:

No exemplo do endereço, suponha que o DataContext de é Panel atribuído ao objeto do tipo Address. A encadernação de cada TextBox um é adicionada ao BindingGroup do painel.

Adiciona-se ValidationRule objetos a um BindingGroup. O BindingGroup é passado como o primeiro parâmetro do Validate método quando o ValidationRule executa. Podes usar o TryGetValue método ou GetValue(Object, String) nisso BindingGroup para obter os valores propostos do objeto, e a Items propriedade para obter as fontes das ligações.

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

Construtores

Name Description
BindingGroup()

Inicializa uma nova instância da BindingGroup classe.

Propriedades

Name Description
BindingExpressions

Obtém uma coleção de BindingExpression objetos que contém informação para cada Binding no BindingGroup.

CanRestoreValues

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

DependencyObjectType

Obtém o DependencyObjectType que envolve o tipo CLR desta instância.

(Herdado de DependencyObject)
Dispatcher

Percebe o Dispatcher que isto DispatcherObject está associado.

(Herdado de DispatcherObject)
HasValidationError

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

IsDirty

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

IsSealed

Recebe um valor que indica se esta instância está atualmente selada (apenas leitura).

(Herdado de DependencyObject)
Items

Obtém as fontes que são usadas pelos objetos Binding no BindingGroup.

Name

Recebe ou define o nome que identifica o BindingGroup, que pode ser usado para incluir e excluir objetos de ligação no BindingGroup.

NotifyOnValidationError

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

Owner

Obtém o objeto a que isto BindingGroup está atribuído.

SharesProposedValues

Recebe ou define um valor que indica se reutiliza BindingGroup valores-alvo que não foram comprometidos com a fonte.

ValidatesOnNotifyDataError

Obtém ou define um valor que indica se deve incluir o NotifyDataErrorValidationRule.

ValidationErrors

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

ValidationRules

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

Métodos

Name Description
BeginEdit()

Inicia uma transação de edição nas fontes do BindingGrouparquivo .

CancelEdit()

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

CheckAccess()

Determina se o thread que chama 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 DependencyProperty identificador.

(Herdado de DependencyObject)
ClearValue(DependencyPropertyKey)

Limpa o valor local de uma propriedade de apenas leitura. O imóvel a ser limpo é especificado por um DependencyPropertyKey.

(Herdado de DependencyObject)
CoerceValue(DependencyProperty)

Coage o valor da propriedade de dependência especificada. Isto é conseguido invocando qualquer CoerceValueCallback função especificada nos metadados da propriedade para a propriedade de dependência tal como existe na chamada DependencyObject.

(Herdado de DependencyObject)
CommitEdit()

Executa todos os ValidationRule objetos e atualiza as fontes de ligação se todas as regras de validação tiverem sucesso.

Equals(Object)

Determina se um fornecido DependencyObject é equivalente à corrente DependencyObject.

(Herdado de DependencyObject)
GetHashCode()

Obtém um código de hash para isto DependencyObject.

(Herdado de DependencyObject)
GetLocalValueEnumerator()

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

(Herdado de DependencyObject)
GetType()

Obtém o Type da instância atual.

(Herdado de Object)
GetValue(DependencyProperty)

Devolve o valor efetivo atual de uma propriedade de dependência nesta instância de um DependencyObject.

(Herdado de DependencyObject)
GetValue(Object, String)

Devolve 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 atual Object.

(Herdado de Object)
OnPropertyChanged(DependencyPropertyChangedEventArgs)

Invocado sempre que o valor efetivo de qualquer propriedade de dependência disto DependencyObject for atualizado. A propriedade específica da dependência que mudou é reportada nos dados do evento.

(Herdado de DependencyObject)
ReadLocalValue(DependencyProperty)

Devolve o valor local de uma propriedade de dependência, se esta existir.

(Herdado de DependencyObject)
SetCurrentValue(DependencyProperty, Object)

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

(Herdado de DependencyObject)
SetValue(DependencyProperty, Object)

Define o valor local de uma propriedade de dependência, especificado pelo seu identificador de propriedade de dependência.

(Herdado de DependencyObject)
SetValue(DependencyPropertyKey, Object)

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

(Herdado de DependencyObject)
ShouldSerializeProperty(DependencyProperty)

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

(Herdado de DependencyObject)
ToString()

Devolve uma cadeia 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 ligação e nos ValidationRule objetos que têm ValidationStep a propriedade definida para RawProposedValue, ConvertedProposedValue, ou UpdatedValue e guarda os valores dos alvos nos objetos de origem se todas as regras de validação tiverem sucesso.

ValidateWithoutUpdate()

Executa o conversor sobre a ligação e os ValidationRule objetos que têm a ValidationStep propriedade definida como RawProposedValue ou ConvertedProposedValue.

VerifyAccess()

Faz cumprir que o thread que chama tem acesso a este DispatcherObject.

(Herdado de DispatcherObject)

Aplica-se a