次の方法で共有


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 を作成し、アプリケーションのユーザー インターフェイス (UI) を作成するときにルート StackPanel を追加します。

  • アプリケーションのロジックで BeginEditCommitEdit、および CancelEdit を呼び出して、変更のロールバックを有効にします。

  • Validate メソッドで TryGetValue を呼び出してユーザーの入力を取得し、100 ドルを超えるアイテムが少なくとも 7 日間使用できるかどうかを確認します。

次の例では、アプリケーションのユーザー インターフェイス (UI) を作成します。 ルート StackPanel には、前に説明したように、項目を検証する ValidationRule を含む BindingGroup があります。 Price プロパティと OfferExpires プロパティのバインド オブジェクトは BindingGroup の一部になり、各バインディングには、価格と日付がそれぞれ有効な値であることを確認するための ValidationRule があります。 個々のプロパティの検証規則は、BindingGroupValidationRule の前に実行されます。

<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 が失敗すると、アプリケーションが (前の例の) BindingGrouptrue するように NotifyOnValidationError 設定されているため、Validation.Error イベントが発生します。 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 に追加されたカスタム 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 は、複数のバインド間にリレーションシップを作成します。このリレーションシップは、まとめて検証および更新できます。 たとえば、アプリケーションがユーザーにアドレスの入力を求めるメッセージを表示するとします。 その後、アプリケーションは、プロパティ、StreetCityZipCodeCountryを持つ Address型のオブジェクトに、ユーザーが指定した値を設定します。 アプリケーションには、4 つの TextBox コントロールを含むパネルがあり、それぞれがオブジェクトのプロパティのいずれかにバインドされたデータです。 BindingGroupValidationRule を使用して、Address オブジェクトを検証できます。 バインドが同じ BindingGroupに参加している場合は、郵便番号が住所の国/地域に対して有効であることを確認できます。

FrameworkElement または FrameworkContentElementBindingGroup プロパティを設定します。 子要素は、他の継承可能なプロパティと同様に、親要素から BindingGroup を継承します。 次のいずれかの状況が発生した場合、子孫要素のバインドが BindingGroup に追加されます。

アドレスの例では、PanelDataContextAddress型のオブジェクトに設定されるとします。 各 TextBox のバインドがパネルの BindingGroup に追加されます。

ValidationRule オブジェクトを BindingGroupに追加します。 BindingGroup は、ValidationRule の実行時に、Validate メソッドの最初のパラメーターとして渡されます。 その BindingGroupTryGetValue または GetValue(Object, String) メソッドを使用して、オブジェクトの提案値を取得し、Items プロパティを使用してバインディングのソースを取得できます。

BindingGroup では、各バインディングが個別に更新されるのではなく、バインドのソースが同時に更新されます。 いずれかのメソッドを呼び出してデータ (ValidateWithoutUpdateUpdateSources、または CommitEdit) を検証すると、例の各 TextBox のバインドが検証され、更新される可能性があります。 バインドが BindingGroupの一部である場合、UpdateSourceTrigger プロパティを明示的に設定しない限り、UpdateSources を呼び出すか、BindingGroupCommitEdit するまで、バインディングのソースは更新されません。

コンストラクター

BindingGroup()

BindingGroup クラスの新しいインスタンスを初期化します。

プロパティ

BindingExpressions

BindingGroup内の各 Binding の情報を含む BindingExpression オブジェクトのコレクションを取得します。

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

BindingGroup内のソース オブジェクトを検証する ValidationRule オブジェクトのコレクションを取得します。

メソッド

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()

ValidationStep プロパティが RawProposedValueConvertedProposedValue、または UpdatedValue に設定されているバインディングおよび ValidationRule オブジェクトに対してコンバーターを実行し、すべての検証規則が成功した場合にターゲットの値をソース オブジェクトに保存します。

ValidateWithoutUpdate()

ValidationStep プロパティが RawProposedValue または ConvertedProposedValueに設定されているバインディングおよび ValidationRule オブジェクトに対してコンバーターを実行します。

VerifyAccess()

呼び出し元のスレッドがこの DispatcherObjectにアクセスすることを強制します。

(継承元 DispatcherObject)

適用対象