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
继承

示例

以下示例创建一个应用程序,提示用户输入项目的说明和价格以及产品/服务到期日期。 应用程序显示窗体下方项的当前信息。 用户可以提交或取消更改。

应用程序执行以下操作来实现此行为。

以下示例创建应用程序的用户界面(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 事件,并向用户显示有关验证错误的信息。 该示例还处理 StackPanelLoaded 事件,以及 “取消”按钮的 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 的自定义 ValidationRuleValidateDateAndPriceValidationRule 在其 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的对象,该对象具有属性、StreetCityZipCodeCountry。 该应用程序有一个面板,其中包含四个 TextBox 控件,每个控件都是绑定到对象属性之一的数据。 可以使用 BindingGroup 中的 ValidationRule 来验证 Address 对象。 如果绑定参与同一 BindingGroup,则可以确保邮政编码对地址的国家/地区有效。

FrameworkElementFrameworkContentElement上设置 BindingGroup 属性。 子元素从父元素继承 BindingGroup,就像使用任何其他可继承属性一样。 如果发生以下情况之一,则会将子代元素上的绑定添加到 BindingGroup

在地址示例中,假设 PanelDataContext 设置为 Address类型的对象。 每个 TextBox 的绑定将添加到面板的 BindingGroup

ValidationRule 对象添加到 BindingGroupBindingGroupValidationRule 运行时作为 Validate 方法的第一个参数传递。 可以使用该 BindingGroup 上的 TryGetValueGetValue(Object, String) 方法获取对象的建议值,使用 Items 属性来获取绑定的源。

BindingGroup 同时更新绑定的源,而不是单独更新每个绑定。 调用其中一个方法来验证数据(ValidateWithoutUpdateUpdateSourcesCommitEdit),将验证示例中每个 TextBox 的绑定并可能更新。 当绑定是 BindingGroup的一部分时,除非显式设置 UpdateSourceTrigger 属性,否则除非对 BindingGroup调用 UpdateSourcesCommitEdit,否则绑定的源不会更新。

构造函数

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中的源对象。

方法

BeginEdit()

开始对 BindingGroup中的源执行编辑事务。

CancelEdit()

结束编辑事务并放弃挂起的更改。

CheckAccess()

确定调用线程是否有权访问此 DispatcherObject

(继承自 DispatcherObject)
ClearValue(DependencyProperty)

清除属性的本地值。 要清除的属性由 DependencyProperty 标识符指定。

(继承自 DependencyObject)
ClearValue(DependencyPropertyKey)

清除只读属性的本地值。 要清除的属性由 DependencyPropertyKey指定。

(继承自 DependencyObject)
CoerceValue(DependencyProperty)

强制指定依赖属性的值。 这是通过在调用 DependencyObject上调用依赖属性的属性元数据中指定的任何 CoerceValueCallback 函数来实现的。

(继承自 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 属性设置为 RawProposedValueConvertedProposedValueUpdatedValue,并在所有验证规则成功的情况下将目标的值保存到源对象。

ValidateWithoutUpdate()

对绑定和 ValidationStep 属性设置为 RawProposedValueConvertedProposedValueValidationRule 对象运行转换器。

VerifyAccess()

强制调用线程有权访问此 DispatcherObject

(继承自 DispatcherObject)

适用于