0

フィールドが少ない登録フォームがあります。それはPRISM MVVMアプリケーションです。

フィールドの1つのXAMLは次のようになります(RegisterView.xaml):

<TextBlock>Surname</TextBlock>
<TextBox Validation.ErrorTemplate="{StaticResource validationTemplate}"      HorizontalAlignment="Left" Margin="0" Name="Surname" VerticalAlignment="Top" >
    <TextBox.Text>
        <Binding Path="Surname" UpdateSourceTrigger="LostFocus" >
            <Binding.ValidationRules>
                 <val:Required />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

上記のコードからわかるように、フィールドを検証するためにクラスRequiredを使用します。次に、Requiredクラスの関数Validate()がValidationResultオブジェクトを返します。また、入力のスタイルにいくつかのトリガーを定義したので、検証結果をビュー内のユーザーに表示できます。

私が知らないのは、ViewModelのすべての入力の検証状態を検出する方法です。ViewModelには、SaveUserCanExecuteすべての入力の検証状態の基本にある登録フォーム送信ボタンを有効/無効にする機能があります。

それで、これを達成する簡単な方法はありますか?

これを回避することはできますが、適切な方法ではないと思います。

ここで、送信ボタンのClickイベントで起動されるビューコードでSubmit_Click関数を作成しました。

RegisterView.xaml内

<Button Content="Register" HorizontalAlignment="Left" Margin="0" Name="Submit" VerticalAlignment="Top" Command="{x:Static inf:Commands.SaveUser}" Click="Submit_Click" />

また、コードビハインドで新しいパブリックブール変数「formIsValid」を作成しました。送信ボタンを押すと、すべての入力に検証エラーがないかどうかを確認します(Validation.GetHasError(InputName)関数付き)。そうである場合は、formIsValid変数をtrueに設定し、そうでない場合はfalseに設定します。

RegisterView.xaml.cs内

private void Submit_Click(object sender, RoutedEventArgs e)
{
    if (Validation.GetHasError(Firstname) == false && Validation.GetHasError(Surname) == false)
    {
        registerFormValid = true;
    }
    else
    {
        registerFormValid = false;
    }
}

次に、ViewModelSaveUserCanExecute関数は次のようになります。

private bool SaveUserCanExecute(string parameter)
{
    if (View.registerFormValid == true)
    {
        return true;
    }
    return false;
}

しかし、前に述べたように、それは適切な方法ではないと思います。私はもっと明確な方法を探しています。

4

2 に答える 2

1

ViewModel に IDataErrorInfo を実装すると、VM で必要なすべての情報が得られます。XAML には ValidatesOnDataErrors=true だけが必要です

<TextBlock>Surname</TextBlock>
<TextBox Validation.ErrorTemplate="{StaticResource validationTemplate}"      HorizontalAlignment="Left" Margin="0" Name="Surname" VerticalAlignment="Top" >
        <TextBox.Text>
            <Binding Path="Surname" UpdateSourceTrigger="LostFocus" ValidatesOnDataErrors="True">
            </Binding>
        </TextBox.Text>
 </TextBox>

編集: DelegeCommand の使用を確認すると、コマンド CanExecute は単純に string.IsNullOrEmpty(this.Error) を確認できます。

于 2012-04-30T05:28:38.103 に答える
0

コマンド (ICommand) を送信ボタンにバインドし、このロジックをその CanExecute メソッドに実装します。これは、古典的なICommandの実装です。

于 2012-04-29T16:17:17.400 に答える