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 には、前に説明したように、項目を検証する ValidationRule を含む BindingGroup があります。
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 が失敗すると、アプリケーションが (前の例の) BindingGroup で true
するように NotifyOnValidationError 設定されているため、Validation.Error イベントが発生します。
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 は、複数のバインド間にリレーションシップを作成します。このリレーションシップは、まとめて検証および更新できます。 たとえば、アプリケーションがユーザーにアドレスの入力を求めるメッセージを表示するとします。 その後、アプリケーションは、プロパティ、Street
、City
、ZipCode
、Country
を持つ Address
型のオブジェクトに、ユーザーが指定した値を設定します。 アプリケーションには、4 つの 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 プロパティを明示的に設定しない限り、UpdateSources を呼び出すか、BindingGroupで CommitEdit するまで、バインディングのソースは更新されません。
コンストラクター
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 オブジェクトのコレクションを取得します。 |
メソッド
適用対象
.NET