DataGrid
によって入力された の入力を検証しようとしていますDataView
(例: myDataGrid.ItemsSource = myDataView
)。ただし、私が見た WPF DataGrid 検証の例はすべて、DataGrid
ソースが C# クラスであることを前提としています。単一のセル (つまり、列) をコード ビハインドの検証に接続する方法がわかりません。誰かが例を挙げたり、私に指摘したりできますか?
2 に答える
そのため、さらに調査を行いましたが、基本的に欠けていたのは、列名をPath
a の属性で指定できることですBinding
(または、列の序数を括弧で囲んで使用することもできます) Path="[0]"
。その認識の後、すべては基本的にクラス プロパティを使用する場合と同じです。したがって、DataGrid
私が使用する典型的な列定義は次のとおりです。
<DataGridTextColumn Header="Regular" EditingElementStyle="{StaticResource ValidationErrorStyleBoxRA}" ElementStyle="{StaticResource ValidationErrorStyleBlockRA}" Width="60">
<DataGridTextColumn.Binding>
<Binding Path="HourlyRate" StringFormat="F3" ValidatesOnExceptions="True" ValidatesOnDataErrors="True" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<local:HourlyRatesAmountValidate ValidatesOnTargetUpdated="True" />
</Binding.ValidationRules>
</Binding>
</DataGridTextColumn.Binding>
</DataGridTextColumn>
わかりました、いくつかの簡単なテストを行いました。実際に手動で行うことの主な障害は、表示用に DataView を直接割り当てるときに、DataGridCell がそのコンテンツのバインディングを作成しないことだと思います。ただし、DataGrid を作成するときにカスタム s を割り当てるという面倒なことをいとわない場合は DataGridTemplateColumn
、テンプレート内の TextBox インスタンスなどのバインディングにアクセスして、それらにカスタム検証エラーを設定できます。
実際には、これまたは DataGrid によって生成されたテキスト ボックスのデフォルト スタイルをオーバーライドします。ご覧のとおり、デフォルトのテキスト ボックス スタイルには境界線などがないため、検証エラーを設定しても効果はありません。DataTemplate を使用して通常のテキスト ボックスにするか、そのスタイルをオーバーライドすると、検証エラーを設定した結果として実際に何かを表示できるようになります。
ただし、自分で調査を行う必要があります。私は簡単なプロトタイプを作成しましたが、それは機能しますが、DataTemplate でバインディングを正しく作成できません (最後に作業して以来知っていたすべての WPF を忘れたか、適切なバインディングの操作方法しか知りません:)) . あなたがそれでどこかにたどり着けば、先に進むのはより簡単です:
どうにかして BindingExpression にアクセスします。私がしたことは、LostFocus イベントにハンドラーをアタッチし、失われたフォーカスが DataGridCell 内のテキスト ボックスであるかどうかを確認することでした。その場合、そのバインディングを無効としてマークするだけです ( t
TextBox インスタンスを表す):
var x = t.GetBindingExpression(TextBox.TextProperty);
Validation.MarkInvalid(x, new ValidationError(new ExceptionValidationRule(), x.ParentBinding, "error", new Exception("error")));
正直に言うと、ValidationError コンストラクターでの各引数の役割が何であるかはもうわかりません (例外メッセージはデフォルトで検証ツールチップに表示されると思いますか?それともエラーの内容ですか?)。それを理解してください。よろしければ、私は休憩を取ろうと思います... 私が言ったように、流れに逆らうことは簡単ではありません:)