2012-04-29 2 views
0

私はフィールドが少ない登録フォームを持っています。それはPRISM MVVMアプリケーションです。あなたは、私がフィールドを検証するために必要なクラスを使用し、上記のコードから見ることができるようにView Modelで正常に検証されたフォームについて知る方法

<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> 

:フィールドの1の

XAMLは、この(RegisterView.xaml)のように見えます。クラスRequiredのValidate()は、ValidationResultオブジェクトを返します。また、入力のスタイルにいくつかのトリガーを定義しました。そのため、検証結果をユーザーに表示することができます。

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

これを実現する方法は簡単ですか?

私はこれに対していくつかの回避策をとることができましたが、私は適切な方法ではないと思います。

送信ボタンのClickイベントで発生したViewコードで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" を作成しました。 Submitボタンを押すと、すべての入力に妥当性チェックエラーがないかどうかチェックされます(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; 
    } 
} 

は、その後のViewModelにSaveUserCanExecute関数は次のようになります。

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

しかし、私は前に述べたように、私はit'sない適切な方法だと思うし、私はいくつかのより明確な方法を探しています。

答えて

1

ViewModelにIDataErrorInfoを実装すると、VMに必要なすべての情報が得られます。 DelegeCommandの使用をチェックしてから、コマンドCanExecuteは、単にstring.IsNullOrEmpty(this.Error)のために、次にチェックすることができます:あなたのXAMLは、ちょうど真ValidatesOnDataErrors =

<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> 

EDITを必要としています。

+0

良いですが、IDataErrorInfoを正しく実装して検証の結果を返す方法はありますか?私は多くのIDataErrorInfoの例をチェックしました。ほとんどの場合、いくつかの検証関数をpublic string [string propertyName] {validation functions here}に入れました。しかし、私はすでにバリデーション関数をを持つxaml要素にバインドしていますので、同じ関数を2回呼び出す必要はありません。ありがとう。 – mantonn

+0

そして、私がMessageBox.Show(this.Error)を呼び出すと、私のコードでは、何も表示されず、メッセージボックスも表示されません。 – mantonn

+0

最後に、IDataErrorInfoを使用しました。ありがとう – mantonn

0

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

+0

これは少し違ったやり方です。送信ボタンにバインドコンポジットコマンドをバインドしました(Command = "{x:Static inf:Commands.SaveUser}"を参照)。問題は、CanExecute関数がViewModelにあることです。そのため、すべての入力の検証に関する情報を取得する必要があります。または私はあなたの答えを得ていませんでした。とにかくありがとう。 – mantonn

+0

ICommandオブジェクトを作成すると、ExecuteとCanExecuteの両方が変更されます。これはビューモデルレベルで行われるため、既存のメソッドを渡すことができます。入力要素のフォーカスが変化すると、WPFはCanExecuteを自動的に呼び出します。 – anivas

関連する問題