Condividi tramite


BindingGroup Classe

Definizione

Contiene una raccolta di associazioni e ValidationRule oggetti utilizzati per convalidare un oggetto.

public ref class BindingGroup : System::Windows::DependencyObject
public class BindingGroup : System.Windows.DependencyObject
type BindingGroup = class
    inherit DependencyObject
Public Class BindingGroup
Inherits DependencyObject
Ereditarietà

Esempio

Negli esempi seguenti viene creata un'applicazione che richiede all'utente di immettere la descrizione e il prezzo di un articolo e la data di scadenza dell'offerta. L'applicazione visualizza le informazioni correnti per l'elemento sotto il modulo. L'utente può inviare o annullare le modifiche.

L'applicazione esegue le operazioni seguenti per ottenere questo comportamento.

  • Crea un BindingGroup e lo aggiunge al StackPanel radice quando crea l'interfaccia utente dell'applicazione.

  • Chiama BeginEdit, CommitEdite CancelEdit nella logica dell'applicazione per abilitare il rollback delle modifiche.

  • Chiama TryGetValue in un metodo Validate per ottenere l'input dell'utente e quindi verificare che un articolo su 100 dollari sia disponibile per almeno sette giorni.

Nell'esempio seguente viene creata l'interfaccia utente dell'applicazione. Il StackPanel radice ha un BindingGroup che contiene un ValidationRule che convalida l'elemento, come descritto in precedenza. Gli oggetti di associazione nella proprietà Price e la proprietà OfferExpires diventano parte del BindingGroup e ogni associazione dispone di un ValidationRule per assicurarsi che il prezzo e la data, rispettivamente, siano valori validi. Le regole di convalida per le singole proprietà vengono eseguite prima del ValidationRule nel 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>

Nell'esempio seguente vengono illustrati i gestori eventi per l'applicazione. Quando l'utente fa clic sul pulsante Invia, l'applicazione chiama CommitEdit per eseguire ogni ValidationRule associata al BindingGroup. Se ogni ValidationRule ha esito positivo, CommitEdit salva i valori nell'oggetto e termina la transazione di modifica. Se CommitEdit ha esito positivo, l'applicazione avvia un'altra transazione di modifica. Quando un ValidationRule ha esito negativo, si verifica l'evento Validation.Error perché l'applicazione imposta NotifyOnValidationError su true nel BindingGroup (nell'esempio precedente). ItemError gestisce l'evento Validation.Error e visualizza informazioni sull'errore di convalida all'utente. L'esempio gestisce anche l'evento per il e l'evento per il pulsante annulla .


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

Nell'esempio seguente viene illustrato il ValidationRuleValidateDateAndPricepersonalizzato , che è stato aggiunto alla BindingGroup nel primo esempio. Il ValidationRule usa il BindingGroup nel metodo Validate per ottenere i valori immessi dall'utente nel modulo e verifica che se un elemento è superiore a 100 dollari, sarà disponibile per almeno sette giorni.

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

Commenti

Un BindingGroup crea una relazione tra più associazioni, che possono essere convalidate e aggiornate insieme. Si supponga, ad esempio, che un'applicazione chiede all'utente di immettere un indirizzo. L'applicazione popola quindi un oggetto di tipo Address, con le proprietà , Street, City, ZipCodee Country, con i valori forniti dall'utente. L'applicazione dispone di un pannello contenente quattro controlli TextBox, ognuno dei quali è associato a una delle proprietà dell'oggetto. È possibile usare un ValidationRule in un BindingGroup per convalidare l'oggetto Address. Se le associazioni partecipano allo stesso BindingGroup, è possibile assicurarsi che il codice postale sia valido per il paese o l'area geografica dell'indirizzo.

Impostare la proprietà BindingGroup su FrameworkElement o FrameworkContentElement. Gli elementi figlio ereditano il BindingGroup dai relativi elementi padre, come con qualsiasi altra proprietà ereditabile. Un'associazione su un elemento discendente viene aggiunta a un BindingGroup se si verifica una delle situazioni seguenti:

Nell'esempio dell'indirizzo si supponga che la DataContext del Panel sia impostata sull'oggetto di tipo Address. L'associazione per ogni TextBox viene aggiunta alla BindingGroup del pannello.

Si aggiungono oggetti ValidationRule a un BindingGroup. Il BindingGroup viene passato come primo parametro del metodo Validate quando viene eseguito il ValidationRule. È possibile utilizzare il metodo TryGetValue o GetValue(Object, String) su tale BindingGroup per ottenere i valori proposti dell'oggetto e la proprietà Items per ottenere le origini delle associazioni.

Un BindingGroup aggiorna le origini dell'associazione contemporaneamente anziché ogni associazione da aggiornare separatamente. Quando si chiama uno dei metodi per convalidare i dati (ValidateWithoutUpdate, UpdateSourceso CommitEdit), l'associazione per ogni TextBox nell'esempio viene convalidata e potenzialmente aggiornata. Quando un'associazione fa parte di un BindingGroup, l'origine dell'associazione non viene aggiornata fino a quando non si chiama UpdateSources o CommitEdit nel BindingGroup, a meno che non si imposti in modo esplicito la proprietà UpdateSourceTrigger.

Costruttori

BindingGroup()

Inizializza una nuova istanza della classe BindingGroup.

Proprietà

BindingExpressions

Ottiene un insieme di oggetti BindingExpression che contiene informazioni per ogni binding nel BindingGroup.

CanRestoreValues

Ottiene un valore che indica se ogni origine nell'associazione può eliminare le modifiche in sospeso e ripristinare i valori originali.

DependencyObjectType

Ottiene il DependencyObjectType che esegue il wrapping del tipo CLR di questa istanza.

(Ereditato da DependencyObject)
Dispatcher

Ottiene il Dispatcher a cui è associato questo DispatcherObject.

(Ereditato da DispatcherObject)
HasValidationError

Ottiene un valore che indica se la BindingGroup ha una regola di convalida non riuscita.

IsDirty

Ottiene o imposta un valore che indica se il BindingGroup contiene un valore proposto che non è stato scritto nell'origine.

IsSealed

Ottiene un valore che indica se questa istanza è attualmente sealed (sola lettura).

(Ereditato da DependencyObject)
Items

Ottiene le origini utilizzate dagli oggetti Binding nel BindingGroup.

Name

Ottiene o imposta il nome che identifica il BindingGroup, che può essere utilizzato per includere ed escludere oggetti Binding nel BindingGroup.

NotifyOnValidationError

Ottiene o imposta un valore che indica se l'evento Error si verifica quando lo stato di un ValidationRule cambia.

Owner

Ottiene l'oggetto a cui è assegnato questo BindingGroup.

SharesProposedValues

Ottiene o imposta un valore che indica se il BindingGroup riutilizza i valori di destinazione di cui non è stato eseguito il commit nell'origine.

ValidatesOnNotifyDataError

Ottiene o imposta un valore che indica se includere il NotifyDataErrorValidationRule.

ValidationErrors

Ottiene un insieme di oggetti ValidationError che hanno causato l'BindingGroup non valido.

ValidationRules

Ottiene una raccolta di oggetti ValidationRule che convalidano gli oggetti di origine nella BindingGroup.

Metodi

BeginEdit()

Avvia una transazione di modifica sulle origini nel BindingGroup.

CancelEdit()

Termina la transazione di modifica e rimuove le modifiche in sospeso.

CheckAccess()

Determina se il thread chiamante ha accesso a questo DispatcherObject.

(Ereditato da DispatcherObject)
ClearValue(DependencyProperty)

Cancella il valore locale di una proprietà. La proprietà da cancellare viene specificata da un identificatore di DependencyProperty.

(Ereditato da DependencyObject)
ClearValue(DependencyPropertyKey)

Cancella il valore locale di una proprietà di sola lettura. La proprietà da cancellare viene specificata da un DependencyPropertyKey.

(Ereditato da DependencyObject)
CoerceValue(DependencyProperty)

Forza il valore della proprietà di dipendenza specificata. Questa operazione viene eseguita richiamando qualsiasi funzione CoerceValueCallback specificata nei metadati delle proprietà per la proprietà di dipendenza così come esiste nella chiamata DependencyObject.

(Ereditato da DependencyObject)
CommitEdit()

Esegue tutti gli oggetti ValidationRule e aggiorna le origini di associazione se tutte le regole di convalida hanno esito positivo.

Equals(Object)

Determina se un DependencyObject specificato è equivalente all'DependencyObjectcorrente.

(Ereditato da DependencyObject)
GetHashCode()

Ottiene un codice hash per questo DependencyObject.

(Ereditato da DependencyObject)
GetLocalValueEnumerator()

Crea un enumeratore specializzato per determinare quali proprietà di dipendenza hanno valori impostati localmente in questo DependencyObject.

(Ereditato da DependencyObject)
GetType()

Ottiene il Type dell'istanza corrente.

(Ereditato da Object)
GetValue(DependencyProperty)

Restituisce il valore effettivo corrente di una proprietà di dipendenza in questa istanza di un DependencyObject.

(Ereditato da DependencyObject)
GetValue(Object, String)

Restituisce il valore proposto per la proprietà e l'elemento specificati.

InvalidateProperty(DependencyProperty)

Rivaluta il valore effettivo per la proprietà di dipendenza specificata.

(Ereditato da DependencyObject)
MemberwiseClone()

Crea una copia superficiale del Objectcorrente.

(Ereditato da Object)
OnPropertyChanged(DependencyPropertyChangedEventArgs)

Richiamato ogni volta che il valore effettivo di qualsiasi proprietà di dipendenza in questo DependencyObject è stato aggiornato. La proprietà di dipendenza specifica modificata viene segnalata nei dati dell'evento.

(Ereditato da DependencyObject)
ReadLocalValue(DependencyProperty)

Restituisce il valore locale di una proprietà di dipendenza, se esistente.

(Ereditato da DependencyObject)
SetCurrentValue(DependencyProperty, Object)

Imposta il valore di una proprietà di dipendenza senza modificarne l'origine del valore.

(Ereditato da DependencyObject)
SetValue(DependencyProperty, Object)

Imposta il valore locale di una proprietà di dipendenza, specificato dall'identificatore della proprietà di dipendenza.

(Ereditato da DependencyObject)
SetValue(DependencyPropertyKey, Object)

Imposta il valore locale di una proprietà di dipendenza di sola lettura, specificato dall'identificatore DependencyPropertyKey della proprietà di dipendenza.

(Ereditato da DependencyObject)
ShouldSerializeProperty(DependencyProperty)

Restituisce un valore che indica se i processi di serializzazione devono serializzare il valore per la proprietà di dipendenza specificata.

(Ereditato da DependencyObject)
ToString()

Restituisce una stringa che rappresenta l'oggetto corrente.

(Ereditato da Object)
TryGetValue(Object, String, Object)

Tenta di ottenere il valore proposto per la proprietà e l'elemento specificati.

UpdateSources()

Esegue il convertitore sull'associazione e gli oggetti ValidationRule con la proprietà ValidationStep impostata su RawProposedValue, ConvertedProposedValueo UpdatedValue e salva i valori delle destinazioni negli oggetti di origine se tutte le regole di convalida hanno esito positivo.

ValidateWithoutUpdate()

Esegue il convertitore sull'associazione e gli oggetti ValidationRule con la proprietà ValidationStep impostata su RawProposedValue o ConvertedProposedValue.

VerifyAccess()

Impone che il thread chiamante abbia accesso a questo DispatcherObject.

(Ereditato da DispatcherObject)

Si applica a