BindingGroup 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
包含用于验证对象的绑定和 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,并在创建应用程序的用户界面(UI)时将其添加到根 StackPanel。
调用应用程序逻辑中的 BeginEdit、CommitEdit和 CancelEdit,以启用回滚更改。
在 Validate 方法中调用 TryGetValue 以获取用户的输入,然后检查一个超过 100 美元的项是否可用至少七天。
以下示例创建应用程序的用户界面(UI)。 根 StackPanel 有一个 BindingGroup,其中包含验证项的 ValidationRule,如前所述。
Price
属性上的绑定对象和 OfferExpires
属性成为 BindingGroup 的一部分,每个绑定都有一个 ValidationRule,以确保价格和日期分别为有效值。 各个属性的验证规则在 BindingGroup上的 ValidationRule 之前运行。
<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 来运行与 BindingGroup关联的每个 ValidationRule。 如果每个 ValidationRule 成功,CommitEdit 将值保存到对象并结束编辑事务。 如果 CommitEdit 成功,应用程序将开始另一个编辑事务。 当 ValidationRule 失败时,会发生 Validation.Error 事件,因为应用程序将 NotifyOnValidationErrortrue
设置为 BindingGroup(在上一示例中)。
ItemError
处理 Validation.Error 事件,并向用户显示有关验证错误的信息。 该示例还处理 StackPanel 的 Loaded 事件,以及 “取消”按钮的 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
以下示例显示了在第一个示例中添加到 BindingGroup 的自定义 ValidationRuleValidateDateAndPrice
。
ValidationRule 在其 Validate 方法中使用 BindingGroup 来获取用户输入到表单中的值,并检查某个项是否超过 100 美元,它至少可在 7 天内使用。
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 控件,每个控件都是绑定到对象属性之一的数据。 可以使用 BindingGroup 中的 ValidationRule 来验证 Address
对象。 如果绑定参与同一 BindingGroup,则可以确保邮政编码对地址的国家/地区有效。
在 FrameworkElement 或 FrameworkContentElement上设置 BindingGroup 属性。 子元素从父元素继承 BindingGroup,就像使用任何其他可继承属性一样。 如果发生以下情况之一,则会将子代元素上的绑定添加到 BindingGroup:
绑定的源和具有 BindingGroup 的元素的 DataContext 是相同的对象,并且未设置 BindingGroupName 属性。
绑定的 BindingGroupName 属性等于 BindingGroup 的 Name,并且它们未显式设置为
null
。
在地址示例中,假设 Panel 的 DataContext 设置为 Address
类型的对象。 每个 TextBox 的绑定将添加到面板的 BindingGroup。
将 ValidationRule 对象添加到 BindingGroup。 BindingGroup 在 ValidationRule 运行时作为 Validate 方法的第一个参数传递。 可以使用该 BindingGroup 上的 TryGetValue 或 GetValue(Object, String) 方法获取对象的建议值,使用 Items 属性来获取绑定的源。
BindingGroup 同时更新绑定的源,而不是单独更新每个绑定。 调用其中一个方法来验证数据(ValidateWithoutUpdate、UpdateSources或 CommitEdit),将验证示例中每个 TextBox 的绑定并可能更新。 当绑定是 BindingGroup的一部分时,除非显式设置 UpdateSourceTrigger 属性,否则除非对 BindingGroup调用 UpdateSources 或 CommitEdit,否则绑定的源不会更新。
构造函数
BindingGroup() |
初始化 BindingGroup 类的新实例。 |
属性
BindingExpressions |
获取 BindingExpression 对象的集合,该对象包含 BindingGroup中每个绑定的信息。 |
CanRestoreValues |
获取绑定中的每个源是否可以放弃挂起的更改并还原原始值。 |
DependencyObjectType |
获取包装此实例的 CLR 类型的 DependencyObjectType。 (继承自 DependencyObject) |
Dispatcher |
获取与此 DispatcherObject 关联的 Dispatcher。 (继承自 DispatcherObject) |
HasValidationError |
获取一个值,该值指示 BindingGroup 是否具有失败的验证规则。 |
IsDirty |
获取或设置一个值,该值指示 BindingGroup 是否包含尚未写入源的建议值。 |
IsSealed |
获取一个值,该值指示此实例当前是否密封(只读)。 (继承自 DependencyObject) |
Items |
获取 BindingGroup中的 Binding 对象使用的源。 |
Name |
获取或设置标识 BindingGroup的名称,该名称可用于在 BindingGroup中包含和排除 Binding 对象。 |
NotifyOnValidationError |
获取或设置 ValidationRule 状态更改时是否发生 Error 事件。 |
Owner |
获取分配给此 BindingGroup 的对象。 |
SharesProposedValues |
获取或设置一个值,该值指示 BindingGroup 是否重用尚未提交到源的目标值。 |
ValidatesOnNotifyDataError |
获取或设置一个值,该值指示是否包含 NotifyDataErrorValidationRule。 |
ValidationErrors |
获取导致 BindingGroup 无效的 ValidationError 对象的集合。 |
ValidationRules |
获取 ValidationRule 对象的集合,这些对象验证 BindingGroup中的源对象。 |