入力フィールド用の TextBox がいくつかあり、ビューに「保存」ボタンがあります。TextBoxes の 2 つは保存に必要なフィールドです。次のように、いくつかの視覚的なフィードバック (赤い境界線とツールヒント) のために、xaml にカスタム ValidationRule を設定しました。
<TextBox ToolTip="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}">
<TextBox.Text>
<Binding Path="ScriptFileMap" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<v:MinimumStringLengthRule MinimumLength="1" ErrorMessage="Map is required for saving." />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
「保存」ボタンは、SaveScript() 関数を呼び出す DelegateCommand にリンクされています。この関数は、2 つの必須フィールドのプロパティが空の場合、ユーザーが保存することを許可しません。
public void SaveScript()
{
if (this.ScriptFileName.Length > 0 && this.ScriptFileMap.Length > 0)
{
// save function logic
}
}
ただし、この関数ではファイルを保存できます。よく調べてみると、これら 2 つのフィールド (ScriptFileName と ScriptFileMap) の値は、ValidationRule が失敗したときに更新されておらず、最後の既知の値になっていることがわかります。
これは ValidationRule の予想される動作ですか、それともどこかに欠けているものや不具合がありますか? 前者の場合、その動作をオーバーライドする方法はありますか? 空の文字列がバインドされたプロパティに渡されない場合、ViewModel での保存を防ぐことはできません。