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 美元的项是否至少有 7 天的可用时间。
以下示例 (应用程序的 UI) 创建用户界面。 根 StackPanel 具有一个 BindingGroup ,其中包含 ValidationRule 用于验证项的 ,如前所述。 属性和 属性上的Price
绑定对象将成为 的BindingGroup一部分,每个绑定都有 ,ValidationRule以确保 price 和 date 分别为有效OfferExpires
值。 各个属性的验证规则在 上的 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个示例中的 (上设置为 NotifyOnValidationErrortrue
BindingGroup) 。Validation.Error 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
以下示例演示了在第一个示例中添加到 BindingGroup 的自定义 。ValidationRuleValidateDateAndPrice
ValidationRuleBindingGroup在其 Validate 方法中使用 来获取用户输入到表单中的值,并检查如果某个项超过 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 个控件,每个控件都是绑定到对象属性之一的数据。 可以在 中使用 ValidationRuleBindingGroup 来验证 Address
对象。 如果绑定参与同一 BindingGroup个 ,则可以确保邮政编码对地址的国家/地区有效。
在 或 FrameworkContentElement上FrameworkElement设置 BindingGroup 属性。 子元素从其父元素继承 BindingGroup ,就像使用任何其他可继承属性一样。 如果发生以下情况之一,则会将子元素上的绑定添加到 BindingGroup 中:
绑定的源和 DataContext 具有 BindingGroup 的元素的 是同一对象, BindingGroupName 并且未设置 属性。
绑定 BindingGroupName 的 属性等于 Name 的 BindingGroup ,它们未显式设置为
null
。
在地址的示例中,假设 DataContext 的 Panel 设置为类型的 Address
对象。 每个 TextBox 的绑定将添加到 BindingGroup 面板的 中。
将 对象添加到 ValidationRuleBindingGroup。 BindingGroup运行时,将作为 方法ValidationRule的第一个参数Validate传递。 可以使用 TryGetValueGetValue(Object, String) 或 BindingGroup 方法获取 对象的建议值,并使用 Items 属性获取绑定的源。
BindingGroup同时更新绑定的源,而不是单独更新每个绑定。 调用方法之一来验证 (ValidateWithoutUpdate、 UpdateSources或 CommitEdit) 的数据时,示例中每个 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 中的源对象。 |