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и CommitEditCancelEdit в логике приложения для включения отката изменений.
Вызовы TryGetValue метода Validate , чтобы получить входные данные пользователя, а затем убедитесь, что элемент более 100 долларов доступен по крайней мере семь дней.
В следующем примере создается пользовательский интерфейс приложения. Корневой каталог StackPanel содержит элемент BindingGroupValidationRule , который проверяет элемент, как описано ранее. Объекты привязки свойства Price и OfferExpires свойства становятся частью BindingGroup каждой привязки ValidationRule , чтобы убедиться, что цена и дата соответственно являются допустимыми значениями. Правила проверки для отдельных свойств выполняются перед параметром ValidationRuleBindingGroup.
<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 так как приложение установлено NotifyOnValidationError на true сайте BindingGroup (в предыдущем примере).
ItemError
Validation.Error обрабатывает событие и отображает сведения об ошибке проверки пользователю. В примере также обрабатывается Loaded событие для StackPanel события и Click события для кнопки "Отмена ".
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, CityZipCodeи , а также Countryзначения, предоставленные пользователем. У приложения есть панель, содержащая четыре TextBox элемента управления, каждая из которых привязана к одному из свойств объекта. Для проверки объекта можно использовать в ValidationRule объекте BindingGroupAddress . Если привязки участвуют в одном и том же BindingGroup, вы можете убедиться, что почтовый индекс действителен для страны или региона адреса.
Вы задаете BindingGroup свойство включено FrameworkElement или FrameworkContentElement. Дочерние BindingGroup элементы наследуются от родительских элементов так же, как и с любым другим наследуемым свойством. Привязка к элементу потомка добавляется BindingGroup в одну из следующих ситуаций:
Источник привязки и DataContext элемент, имеющий BindingGroup тот же объект, и BindingGroupName свойство не задано.
Свойство BindingGroupName привязки равно NameBindingGroup свойству, и они не заданы
nullявным образом.
В примере адреса предположим, что DataContextPanel для объекта типа Addressзадано значение. Привязка для каждой из них TextBox добавляется на BindingGroup панель.
Объекты добавляются ValidationRule в BindingGroupобъект . Передается BindingGroup в качестве первого параметра Validate метода при выполнении ValidationRule . Для получения предлагаемых значений объекта можно использовать TryGetValue метод или GetValue(Object, String) метод BindingGroup , а Items также свойство для получения источников привязок.
Источник BindingGroup привязки обновляется одновременно вместо каждой привязки, обновляемой отдельно. При вызове одного из методов для проверки данных (ValidateWithoutUpdateилиUpdateSourcesCommitEdit) привязка для каждого TextBox из примеров проверяется и потенциально обновляется. Если привязка является частью BindingGroup, источник привязки не обновляется, пока не вызовете UpdateSources или CommitEditBindingGroupне назначите свойство явным UpdateSourceTrigger образом.
Конструкторы
| Имя | Описание |
|---|---|
| BindingGroup() |
Инициализирует новый экземпляр класса BindingGroup. |
Свойства
| Имя | Описание |
|---|---|
| BindingExpressions |
Возвращает коллекцию BindingExpression объектов, содержащих сведения для каждой привязки в объекте BindingGroup. |
| CanRestoreValues |
Возвращает, может ли каждый источник в привязке отменить ожидающие изменения и восстановить исходные значения. |
| DependencyObjectType |
Возвращает объект DependencyObjectType , который упаковывает тип СРЕДЫ CLR этого экземпляра. (Унаследовано от DependencyObject) |
| Dispatcher |
Dispatcher Возвращает это DispatcherObject значение, с которым связано. (Унаследовано от DispatcherObject) |
| HasValidationError |
Возвращает значение, указывающее, имеет ли BindingGroup правило проверки сбоем. |
| IsDirty |
Возвращает или задает значение, указывающее, содержит ли BindingGroup предлагаемое значение, которое не было записано в источник. |
| IsSealed |
Возвращает значение, указывающее, запечатан ли этот экземпляр (только для чтения). (Унаследовано от DependencyObject) |
| Items |
Возвращает источники, используемые объектами Привязки в объекте 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) |