BindingGroup Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Содержит коллекцию привязок и ValidationRule объектов, которые используются для проверки объекта.
public ref class BindingGroup : System::Windows::DependencyObject
public class BindingGroup : System.Windows.DependencyObject
type BindingGroup = class
inherit DependencyObject
Public Class BindingGroup
Inherits DependencyObject
- Наследование
Примеры
В следующих примерах создается приложение, которое предложит пользователю ввести описание и цену элемента, а также дату истечения срока действия предложения. Приложение отображает текущие сведения для элемента под формой. Пользователь может отправить или отменить изменения.
Приложение выполняет указанные ниже действия, чтобы добиться этого.
Создает BindingGroup и добавляет его корневую StackPanel при создании пользовательского интерфейса приложения.
Вызывает BeginEdit, CommitEditи CancelEdit в логике приложения, чтобы включить откат изменений.
Вызывает TryGetValue в методе Validate, чтобы получить входные данные пользователя, а затем убедитесь, что элемент более 100 долларов доступен по крайней мере семь дней.
В следующем примере создается пользовательский интерфейс приложения. Корневой StackPanel имеет BindingGroup, содержащий ValidationRule, который проверяет элемент, как описано ранее. Объекты привязки для свойства Price
и свойства OfferExpires
становятся частью BindingGroup, и каждая привязка имеет ValidationRule, чтобы убедиться, что цена и дата соответственно являются допустимыми значениями. Правила проверки отдельных свойств выполняются до ValidationRule на 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>
В следующем примере показаны обработчики событий для приложения. Когда пользователь нажимает кнопку "Отправить", приложение вызывает CommitEdit для запуска каждого ValidationRule, связанного с BindingGroup. Если каждая ValidationRule успешно выполнена, CommitEdit сохраняет значения в объекте и завершает транзакцию редактирования. Если CommitEdit выполнен успешно, приложение начинает другую транзакцию редактирования. При сбое ValidationRule происходит событие Validation.Error, так как приложение NotifyOnValidationErrortrue
BindingGroup (в предыдущем примере).
ItemError
обрабатывает событие Validation.Error и отображает сведения об ошибке проверки пользователю. В примере также обрабатывается событие
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
В следующем примере показана пользовательская ValidationRuleValidateDateAndPrice
, которая была добавлена в BindingGroup в первом примере.
ValidationRule использует BindingGroup в своем методе Validate для получения значений, введенных пользователем в форму, и проверяет, что если элемент превышает 100 долларов, он будет доступен по крайней мере семь дней.
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
Комментарии
BindingGroup создает связь между несколькими привязками, которые можно проверить и обновить вместе. Например, предположим, что приложение предложит пользователю ввести адрес. Затем приложение заполняет объект типа Address
, который содержит свойства, Street
, City
, ZipCode
и Country
, со значениями, предоставленными пользователем. Приложение содержит панель, содержащую четыре элемента управления TextBox, каждая из которых является данными, привязанными к одному из свойств объекта. Для проверки объекта Address
можно использовать ValidationRule в BindingGroup. Если привязки участвуют в том же BindingGroup, вы можете убедиться, что zip-код действителен для страны или региона адреса.
Для свойства BindingGroup задано значение FrameworkElement или FrameworkContentElement. Дочерние элементы наследуют BindingGroup от родительских элементов так же, как и с любым другим наследуемым свойством. Привязка к элементу потомка добавляется в BindingGroup, если возникает одна из следующих ситуаций:
Источник привязки и DataContext элемента, имеющего BindingGroup, являются тем же объектом, а свойство BindingGroupName не задано.
Свойство BindingGroupName привязки равно NameBindingGroup, и они не заданы явным образом
null
.
В примере адреса предположим, что для DataContextPanel задан объект типа Address
. Привязка для каждого TextBox добавляется в BindingGroup панели.
Вы добавляете объекты ValidationRule в BindingGroup. BindingGroup передается в качестве первого параметра метода Validate при запуске ValidationRule. Для получения предлагаемых значений объекта можно использовать метод TryGetValue или BindingGroupGetValue(Object, String) для получения предлагаемых значений объекта и свойства Items для получения источников привязок.
BindingGroup обновляет источники привязки одновременно, а не каждую привязку, обновляемую отдельно. При вызове одного из методов проверки данных (ValidateWithoutUpdate, UpdateSourcesили CommitEdit), привязка для каждого TextBox в примере проверяется и потенциально обновляется. Если привязка является частью BindingGroup, источник привязки не обновляется, пока вы не вызовете UpdateSources или CommitEdit на BindingGroup, если только не задано явное свойство UpdateSourceTrigger.
Конструкторы
BindingGroup() |
Инициализирует новый экземпляр класса BindingGroup. |
Свойства
BindingExpressions |
Возвращает коллекцию объектов BindingExpression, содержащих сведения для каждой привязки в BindingGroup. |
CanRestoreValues |
Возвращает, может ли каждый источник в привязке отменить ожидающие изменения и восстановить исходные значения. |
DependencyObjectType |
Возвращает DependencyObjectType, который упаковывает тип СРЕДЫ CLR этого экземпляра. (Унаследовано от DependencyObject) |
Dispatcher |
Возвращает Dispatcher, с которым связан этот DispatcherObject. (Унаследовано от DispatcherObject) |
HasValidationError |
Возвращает значение, указывающее, имеет ли BindingGroup правило проверки сбоем. |
IsDirty |
Возвращает или задает значение, указывающее, содержит ли BindingGroup предлагаемое значение, которое не было записано в источник. |
IsSealed |
Возвращает значение, указывающее, запечатан ли этот экземпляр (только для чтения). (Унаследовано от DependencyObject) |
Items |
Возвращает источники, используемые объектами Binding в BindingGroup. |
Name |
Возвращает или задает имя, определяющее BindingGroup, которое можно использовать для включения и исключения объектов Привязки в BindingGroup. |
NotifyOnValidationError |
Возвращает или задает, происходит ли событие Error при изменении состояния ValidationRule. |
Owner |
Возвращает объект, которому назначен этот BindingGroup. |
SharesProposedValues |
Возвращает или задает значение, указывающее, использует ли BindingGroup целевые значения, которые не были зафиксированы в источнике. |
ValidatesOnNotifyDataError |
Возвращает или задает значение, указывающее, следует ли включать NotifyDataErrorValidationRule. |
ValidationErrors |
Возвращает коллекцию объектов ValidationError, которые привели к недопустимости BindingGroup. |
ValidationRules |
Возвращает коллекцию объектов ValidationRule, которые проверяют исходные объекты в BindingGroup. |
Методы
BeginEdit() |
Начинает транзакцию редактирования источников в BindingGroup. |
CancelEdit() |
Завершает транзакцию редактирования и отменяет ожидающие изменения. |
CheckAccess() |
Определяет, имеет ли вызывающий поток доступ к этому DispatcherObject. (Унаследовано от DispatcherObject) |
ClearValue(DependencyProperty) |
Очищает локальное значение свойства. Свойство для очистки указывается идентификатором DependencyProperty. (Унаследовано от DependencyObject) |
ClearValue(DependencyPropertyKey) |
Очищает локальное значение свойства только для чтения. Свойство для очистки указывается DependencyPropertyKey. (Унаследовано от DependencyObject) |
CoerceValue(DependencyProperty) |
Принуждает значение указанного свойства зависимостей. Это достигается путем вызова любой функции CoerceValueCallback, указанной в метаданных свойства для свойства зависимостей, так как он существует в вызывающей DependencyObject. (Унаследовано от DependencyObject) |
CommitEdit() |
Запускает все объекты ValidationRule и обновляет источники привязки, если все правила проверки выполнены успешно. |
Equals(Object) |
Определяет, эквивалентен ли предоставленный DependencyObject текущему DependencyObject. (Унаследовано от DependencyObject) |
GetHashCode() |
Возвращает хэш-код для этого DependencyObject. (Унаследовано от DependencyObject) |
GetLocalValueEnumerator() |
Создает специализированный перечислитель для определения того, какие свойства зависимостей имеют локальные значения для этого DependencyObject. (Унаследовано от DependencyObject) |
GetType() |
Возвращает Type текущего экземпляра. (Унаследовано от Object) |
GetValue(DependencyProperty) |
Возвращает текущее эффективное значение свойства зависимостей для этого экземпляра DependencyObject. (Унаследовано от DependencyObject) |
GetValue(Object, String) |
Возвращает предлагаемое значение для указанного свойства и элемента. |
InvalidateProperty(DependencyProperty) |
Повторно вычисляет эффективное значение для указанного свойства зависимостей. (Унаследовано от DependencyObject) |
MemberwiseClone() |
Создает неглубокую копию текущей Object. (Унаследовано от Object) |
OnPropertyChanged(DependencyPropertyChangedEventArgs) |
Вызывается при каждом обновлении эффективного значения любого свойства зависимостей в этом DependencyObject. Определенное свойство зависимостей, которое изменилось, сообщается в данных события. (Унаследовано от DependencyObject) |
ReadLocalValue(DependencyProperty) |
Возвращает локальное значение свойства зависимостей, если оно существует. (Унаследовано от DependencyObject) |
SetCurrentValue(DependencyProperty, Object) |
Задает значение свойства зависимостей, не изменяя его источник значений. (Унаследовано от DependencyObject) |
SetValue(DependencyProperty, Object) |
Задает локальное значение свойства зависимостей, указанное его идентификатором свойства зависимостей. (Унаследовано от DependencyObject) |
SetValue(DependencyPropertyKey, Object) |
Задает локальное значение свойства зависимостей только для чтения, указанное идентификатором DependencyPropertyKey свойства зависимостей. (Унаследовано от DependencyObject) |
ShouldSerializeProperty(DependencyProperty) |
Возвращает значение, указывающее, должны ли процессы сериализации сериализовать значение для указанного свойства зависимостей. (Унаследовано от DependencyObject) |
ToString() |
Возвращает строку, представляющую текущий объект. (Унаследовано от Object) |
TryGetValue(Object, String, Object) |
Пытается получить предлагаемое значение для указанного свойства и элемента. |
UpdateSources() |
Запускает преобразователь в привязке и объекты ValidationRule, имеющие свойство ValidationStep, которое имеет значение RawProposedValue, ConvertedProposedValueили UpdatedValue, и сохраняет значения целевых объектов в исходных объектах, если все правила проверки выполнены успешно. |
ValidateWithoutUpdate() |
Запускает преобразователь в привязке и объекты ValidationRule с свойством ValidationStep, заданным для RawProposedValue или ConvertedProposedValue. |
VerifyAccess() |
Принудительно применяет доступ к этому DispatcherObjectвызываемого потока. (Унаследовано от DispatcherObject) |