BindingGroup Klasa
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Zawiera kolekcję powiązań i obiektów ValidationRule używanych do sprawdzania poprawności obiektu.
public ref class BindingGroup : System::Windows::DependencyObject
public class BindingGroup : System.Windows.DependencyObject
type BindingGroup = class
inherit DependencyObject
Public Class BindingGroup
Inherits DependencyObject
- Dziedziczenie
Przykłady
W poniższych przykładach utworzono aplikację, która monituje użytkownika o wprowadzenie opisu i ceny elementu oraz daty wygaśnięcia oferty. Aplikacja wyświetla bieżące informacje dotyczące elementu poniżej formularza. Użytkownik może przesłać lub anulować zmiany.
Aplikacja wykonuje następujące czynności, aby osiągnąć to zachowanie.
Tworzy BindingGroup i dodaje go do głównego StackPanel podczas tworzenia interfejsu użytkownika aplikacji.
Wywołuje BeginEdit, CommitEditi CancelEdit w logice aplikacji, aby umożliwić wycofywanie zmian.
Wywołuje metodę TryGetValue w metodzie Validate, aby uzyskać dane wejściowe użytkownika, a następnie sprawdź, czy element o wartości ponad 100 dolarów jest dostępny przez co najmniej siedem dni.
Poniższy przykład tworzy interfejs użytkownika aplikacji.
StackPanel główny ma BindingGroup, który zawiera ValidationRule, który weryfikuje element zgodnie z wcześniejszym opisem. Obiekty powiązania we właściwości Price
i właściwość OfferExpires
stają się częścią BindingGroup, a każde powiązanie ma ValidationRule, aby upewnić się, że odpowiednio cena i data są prawidłowymi wartościami. Reguły sprawdzania poprawności poszczególnych właściwości są uruchamiane przed ValidationRule w 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>
W poniższym przykładzie przedstawiono programy obsługi zdarzeń dla aplikacji. Gdy użytkownik kliknie przycisk Prześlij, aplikacja wywołuje CommitEdit, aby uruchomić każdy ValidationRule skojarzony z BindingGroup. Jeśli każda ValidationRule zakończy się pomyślnie, CommitEdit zapisuje wartości w obiekcie i kończy transakcję edycji. Jeśli CommitEdit zakończy się pomyślnie, aplikacja rozpocznie kolejną transakcję edycji. Gdy ValidationRule kończy się niepowodzeniem, zdarzenie Validation.Error występuje, ponieważ aplikacja ustawiła NotifyOnValidationError na true
na BindingGroup (w poprzednim przykładzie).
ItemError
obsługuje zdarzenie Validation.Error i wyświetla informacje o błędzie weryfikacji dla użytkownika. Przykład obsługuje również zdarzenie Loaded dla StackPanel i zdarzenie Click dla przycisku Anuluj.
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
W poniższym przykładzie pokazano niestandardowe ValidationRuleValidateDateAndPrice
, które zostały dodane do BindingGroup w pierwszym przykładzie.
ValidationRule używa BindingGroup w metodzie Validate, aby uzyskać wartości wprowadzone przez użytkownika w formularzu i sprawdza, czy element jest ponad 100 dolarów, będzie dostępny przez co najmniej siedem dni.
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
Uwagi
BindingGroup tworzy relację między wieloma powiązaniami, które można zweryfikować i zaktualizować razem. Załóżmy na przykład, że aplikacja monituje użytkownika o wprowadzenie adresu. Następnie aplikacja wypełnia obiekt typu Address
, który ma właściwości, Street
, City
, ZipCode
i Country
, z wartościami podanymi przez użytkownika. Aplikacja ma panel zawierający cztery kontrolki TextBox, z których każda jest danymi powiązanymi z jedną z właściwości obiektu. Aby zweryfikować obiekt Address
, możesz użyć ValidationRule w BindingGroup. Jeśli powiązania uczestniczą w tym samym BindingGroup, możesz upewnić się, że kod pocztowy jest prawidłowy dla kraju/regionu adresu.
Należy ustawić właściwość BindingGroup na FrameworkElement lub FrameworkContentElement. Elementy podrzędne dziedziczą BindingGroup z ich elementów nadrzędnych, podobnie jak w przypadku każdej innej właściwości dziedziczonej. Powiązanie elementu malejąco jest dodawane do BindingGroup, jeśli wystąpi jedna z następujących sytuacji:
Źródło powiązania i DataContext elementu, który ma BindingGroup, są tym samym obiektem, a właściwość BindingGroupName nie jest ustawiona.
Właściwość BindingGroupName powiązania jest równa NameBindingGroup i nie są jawnie ustawione na
null
.
W przykładzie adresu załóżmy, że DataContextPanel jest ustawiona na obiekt typu Address
. Powiązanie dla każdego TextBox jest dodawane do BindingGroup panelu.
Obiekty ValidationRule są dodawane do BindingGroup. BindingGroup jest przekazywany jako pierwszy parametr metody Validate po uruchomieniu ValidationRule. Możesz użyć metody TryGetValue lub GetValue(Object, String) w tej BindingGroup, aby uzyskać proponowane wartości obiektu, a właściwość Items, aby uzyskać źródła powiązań.
BindingGroup aktualizuje źródła powiązania w tym samym czasie zamiast każdego powiązania aktualizowanego oddzielnie. Podczas wywoływania jednej z metod sprawdzania poprawności danych (ValidateWithoutUpdate, UpdateSourceslub CommitEdit) powiązanie dla każdego TextBox w przykładzie jest weryfikowane i potencjalnie aktualizowane. Gdy powiązanie jest częścią BindingGroup, źródło powiązania nie zostanie zaktualizowane do momentu wywołania UpdateSources lub CommitEdit w BindingGroup, chyba że jawnie ustawisz właściwość UpdateSourceTrigger.
Konstruktory
BindingGroup() |
Inicjuje nowe wystąpienie klasy BindingGroup. |
Właściwości
BindingExpressions |
Pobiera kolekcję obiektów BindingExpression, które zawierają informacje dotyczące każdego powiązania w BindingGroup. |
CanRestoreValues |
Pobiera, czy każde źródło w powiązaniu może odrzucić oczekujące zmiany i przywrócić oryginalne wartości. |
DependencyObjectType |
Pobiera DependencyObjectType, który opakowuje typ CLR tego wystąpienia. (Odziedziczone po DependencyObject) |
Dispatcher |
Pobiera Dispatcher jest skojarzony z tym DispatcherObject. (Odziedziczone po DispatcherObject) |
HasValidationError |
Pobiera wartość wskazującą, czy BindingGroup ma regułę sprawdzania poprawności, która zakończyła się niepowodzeniem. |
IsDirty |
Pobiera lub ustawia wartość wskazującą, czy BindingGroup zawiera proponowaną wartość, która nie została zapisana w źródle. |
IsSealed |
Pobiera wartość wskazującą, czy to wystąpienie jest obecnie zapieczętowane (tylko do odczytu). (Odziedziczone po DependencyObject) |
Items |
Pobiera źródła, które są używane przez obiekty Binding w BindingGroup. |
Name |
Pobiera lub ustawia nazwę identyfikującą BindingGroup, która może służyć do dołączania i wykluczania obiektów powiązania w BindingGroup. |
NotifyOnValidationError |
Pobiera lub ustawia, czy zdarzenie Error występuje, gdy stan ValidationRule się zmienia. |
Owner |
Pobiera obiekt, do którego przypisano ten BindingGroup. |
SharesProposedValues |
Pobiera lub ustawia wartość wskazującą, czy BindingGroup ponownie używa wartości docelowych, które nie zostały zatwierdzone w źródle. |
ValidatesOnNotifyDataError |
Pobiera lub ustawia wartość wskazującą, czy należy uwzględnić NotifyDataErrorValidationRule. |
ValidationErrors |
Pobiera kolekcję obiektów ValidationError, które spowodowały, że BindingGroup były nieprawidłowe. |
ValidationRules |
Pobiera kolekcję obiektów ValidationRule, które weryfikują obiekty źródłowe w BindingGroup. |
Metody
BeginEdit() |
Rozpoczyna transakcję edycji źródeł w BindingGroup. |
CancelEdit() |
Kończy transakcję edycji i odrzuca oczekujące zmiany. |
CheckAccess() |
Określa, czy wątek wywołujący ma dostęp do tego DispatcherObject. (Odziedziczone po DispatcherObject) |
ClearValue(DependencyProperty) |
Czyści wartość lokalną właściwości. Właściwość do wyczyszczenia jest określana przez identyfikator DependencyProperty. (Odziedziczone po DependencyObject) |
ClearValue(DependencyPropertyKey) |
Czyści wartość lokalną właściwości tylko do odczytu. Właściwość do wyczyszczenia jest określana przez DependencyPropertyKey. (Odziedziczone po DependencyObject) |
CoerceValue(DependencyProperty) |
Przekształca wartość określonej właściwości zależności. Jest to realizowane przez wywołanie dowolnej funkcji CoerceValueCallback określonej w metadanych właściwości dla właściwości, ponieważ istnieje w wywołaniu DependencyObject. (Odziedziczone po DependencyObject) |
CommitEdit() |
Uruchamia wszystkie obiekty ValidationRule i aktualizuje źródła powiązań, jeśli wszystkie reguły walidacji powiedzie się. |
Equals(Object) |
Określa, czy podany DependencyObject jest odpowiednikiem bieżącego DependencyObject. (Odziedziczone po DependencyObject) |
GetHashCode() |
Pobiera kod skrótu dla tego DependencyObject. (Odziedziczone po DependencyObject) |
GetLocalValueEnumerator() |
Tworzy wyspecjalizowany moduł wyliczający do określania, które właściwości zależności mają lokalnie ustawione wartości na tym DependencyObject. (Odziedziczone po DependencyObject) |
GetType() |
Pobiera Type bieżącego wystąpienia. (Odziedziczone po Object) |
GetValue(DependencyProperty) |
Zwraca bieżącą obowiązującą wartość właściwości zależności dla tego wystąpienia DependencyObject. (Odziedziczone po DependencyObject) |
GetValue(Object, String) |
Zwraca proponowaną wartość dla określonej właściwości i elementu. |
InvalidateProperty(DependencyProperty) |
Ponownie oblicza obowiązującą wartość dla określonej właściwości zależności. (Odziedziczone po DependencyObject) |
MemberwiseClone() |
Tworzy płytkią kopię bieżącego Object. (Odziedziczone po Object) |
OnPropertyChanged(DependencyPropertyChangedEventArgs) |
Wywoływane za każdym razem, gdy wartość efektywna dowolnej właściwości zależności na tym DependencyObject została zaktualizowana. Określona właściwość zależności, która uległa zmianie, jest zgłaszana w danych zdarzenia. (Odziedziczone po DependencyObject) |
ReadLocalValue(DependencyProperty) |
Zwraca wartość lokalną właściwości zależności, jeśli istnieje. (Odziedziczone po DependencyObject) |
SetCurrentValue(DependencyProperty, Object) |
Ustawia wartość właściwości zależności bez zmieniania źródła wartości. (Odziedziczone po DependencyObject) |
SetValue(DependencyProperty, Object) |
Ustawia wartość lokalną właściwości zależności określonej przez jej identyfikator właściwości zależności. (Odziedziczone po DependencyObject) |
SetValue(DependencyPropertyKey, Object) |
Ustawia wartość lokalną właściwości zależności tylko do odczytu określoną przez identyfikator DependencyPropertyKey właściwości zależności. (Odziedziczone po DependencyObject) |
ShouldSerializeProperty(DependencyProperty) |
Zwraca wartość wskazującą, czy procesy serializacji powinny serializować wartość podanej właściwości zależności. (Odziedziczone po DependencyObject) |
ToString() |
Zwraca ciąg reprezentujący bieżący obiekt. (Odziedziczone po Object) |
TryGetValue(Object, String, Object) |
Próbuje uzyskać proponowaną wartość dla określonej właściwości i elementu. |
UpdateSources() |
Uruchamia konwerter w powiązaniu, a obiekty ValidationRule, które mają właściwość ValidationStep ustawioną na RawProposedValue, ConvertedProposedValuelub UpdatedValue, i zapisuje wartości obiektów docelowych w obiektach źródłowych, jeśli wszystkie reguły sprawdzania poprawności powiedzą się. |
ValidateWithoutUpdate() |
Uruchamia konwerter na powiązaniu, a obiekty ValidationRule, które mają właściwość ValidationStep ustawioną na RawProposedValue lub ConvertedProposedValue. |
VerifyAccess() |
Wymusza, że wątek wywołujący ma dostęp do tego DispatcherObject. (Odziedziczone po DispatcherObject) |