6

入力フィールド用の 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 での保存を防ぐことはできません。

4

3 に答える 3

8

はい、これは予想される動作です。デフォルトでは、バリデーション ルールは生の提案された値、つまり、変換されてバインディング ソースに書き戻される前の値に対して実行されます。

ValidationStepルールの を に変更してみてくださいUpdatedValue。これにより、新しい値が変換されて書き戻された後にルールが強制的に実行されます。

于 2014-10-22T17:31:03.673 に答える
2

必要なすべてのプロパティが検証ロジックを通過するまでボタンを無効にしておくCanExecuteメソッドとイベントを実装する必要があります。RaiseCanExecuteChanged

于 2014-10-23T17:27:08.293 に答える
1

ValidationRule を適切に機能させることができなかったので、別のアプローチを取り、いくつかのバインディングを使用しました。テキスト、境界線、およびツールチップのバインディングを含むテキストボックスは次のとおりです。

<TextBox Text="{Binding Path=ScriptFileName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" BorderBrush="{Binding Path=ScriptFileNameBorder, UpdateSourceTrigger=PropertyChanged}" ToolTip="{Binding Path=ScriptFileNameToolTip, UpdateSourceTrigger=PropertyChanged}" />

テキスト フィールドのバインディングは次のとおりです。境界線とツールチップを自分で更新するロジックを使用します (検証なし)。

public string ScriptFileName
        {
            get
            {
                return this.scriptFileName;
            }

            set
            {
                this.scriptFileName = value;
                RaisePropertyChanged(() => ScriptFileName);

                if (this.ScriptFileName.Length > 0)
                {
                    this.ScriptFileNameBorder = borderBrushNormal;
                    this.scriptFileNameToolTip.Content = "Enter the name of the file.";
                }
                else
                {
                    this.ScriptFileNameBorder = Brushes.Red;
                    this.scriptFileNameToolTip.Content = "File name is required for saving.";
                }
            }
        }

このようにすることで、ボックスが空のままになっているときに必要なユーザー フィードバック (赤い境界線とツールヒント メッセージ) を得ることができ、さらに SaveScript 関数のコードを使用して [保存] ボタンが機能しないようにすることができます。

必須にしたい追加フィールドごとに個別のプロパティを用意する必要があるため、もう少し入力が必要ですが、試した他のすべては効果がなかったか、プログラム内の他の何か (ValidationRules と DataTriggers を含む) を壊しました。

于 2014-10-23T17:09:17.497 に答える