WPF アプリケーションで ValidationRules の使用を開始していますが、かなり混乱しています。
次の簡単なルールがあります。
class RequiredRule : ValidationRule
{
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
if (String.IsNullOrWhiteSpace(value as string))
{
return new ValidationResult(false, "Must not be empty");
}
else
{
return new ValidationResult(true, null);
}
}
}
次のように XAML で使用されます。
<TextBox>
<TextBox.Text>
<Binding Path="Identity.Name">
<Binding.ValidationRules>
<validation:RequiredRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
これはほとんど期待どおりに機能します。ソース プロパティ ( Identity.Name
) が設定されていないことに驚きました。変更を認識しない元に戻す機能があり、再入力する以外に値を元に戻す方法はありません (良くありません)。
Microsoft のData Binding Overviewでは、下部にある検証プロセスについて説明しています。これは、この動作を非常によく説明しています。ValidationStep
これに基づいて、私は自分のセットを にしたいと思いUpdatedValue
ます。
<validation:RequiredRule ValidationStep="UpdatedValue"/>
これは私にとって物事が奇妙になるところです。設定されたプロパティ値 (つまり、文字列) であるオブジェクト値で Validate() が呼び出される代わりに、System.Windows.Data.BindingExpression
! Microsoft のドキュメントには、この動作を説明するものは何もありません。
デバッガーで、ソース オブジェクト ( のDataContext
)TextBox
を確認し、プロパティへのパスをナビゲートして、値が設定されていることを確認できます。ただし、検証ルール内で適切なプロパティに到達する良い方法がわかりません。
注: ValidationStep
asConvertedProposedValue
を使用すると、入力された文字列が取得されます (使用しているコンバーターはありません) が、期待どおり、検証が失敗したときにソース プロパティの更新もブロックされます。では、文字列の代わりにCommittedValue
を取得します。BindingExpression
ここにはいくつかの質問があります:
ValidationStep の設定に基づいて Validate() に渡される引数の型に一貫性がないのはなぜですか?
BindingExpression から実際の値を取得するにはどうすればよいですか?
または、ユーザーが TextBox を以前の (有効な) 状態に戻せるようにする良い方法はありますか? (私が述べたように、私自身の元に戻す機能は変更を認識しません。)