2009-07-16 9 views
3

私は私のウィンドウで、次のLoadedイベントを持っている:上記の初期化プロパティーごとにDataContextが設定されていると、検証規則が実行されないのはなぜですか?

void Window_Loaded(object sender, RoutedEventArgs e) { 
    this.DataContext = new MyObject() { 
     MyDateTime = DateTime.Now, 
     MyNotEmptyString = "Not Empty", 
     MyNotUpperCaseString = "not upper case", 
     MyInteger = 20, 
     MyIntegerInRange = 1, 
     MyDouble = 4.56 
    }; 
} 

、私はそれぞれがそれに関連付けられた独自の検証ルール(複数可)を持つ、それに結合するTextBoxを持っています。

this.DataContextが設定されている場合、私の検証ルールは初めて実行されませんが、フォームが正常に使用されているときにはうまく動作します(TextBoxがフォーカスを失ったときに実行されます)。これの背後にある理由は何でしょうか?私はUpdateSourceTrigger="PropertyChanged"を設定しようとしましたが、それは役に立たなかった。

編集:ここでは は、プロパティにバインドされTextBoxの例である:

<TextBox Name="MyDoubleField"> 
    <TextBox.Text> 
     <Binding Path="MyDouble"> 
      <Binding.ValidationRules> 
       <local:TextIsDouble/> 
      </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
</TextBox> 
+0

あなたはIDataErrorInfoの要件を意味するのですか? CSLA検証ルール? – opedog

+0

IDataErrorInfoを使用していません。私が意味するものの例については、編集された質問を参照してください。まだ明らかでない場合はお知らせください。 – Pwninstein

答えて

3

「なぜ」の部分の答えは簡単です:これは仕様です。検証は通常、ユーザーの入力に適用されますが、格納されたデータを検証するためのものではありません。

私は基本的な質問は、コンテキストを設定した後で検証を手動で有効にする方法だと思います。私は分かりませんが、WPFウィンドウにはWinForms Validate()メソッドのようなものがあります。

+0

このSOの質問は、バインドされたフィールドですべての検証ルールを手動で実行する機能を持っています:http://stackoverflow.com/questions/127477/detecting-wpf-validation-errorsしかし、これはまだ、 DataContextを設定するだけです(ボタンをクリックすると、後で動作します)。私がこれをやりたい理由は、どのフィールドが有効でないのかを直ちにユーザに表示することです。保存されているデータが無効になる場合があります(データが既に保存されている場合は、以前のバージョンから要件が変わります)。 – Pwninstein

+0

Window_Loaded()の呼び出しで何が問題になっていますか? –

+0

DataContextが設定された直後に、ロードされたイベントでその関数を呼び出そうとしましたが、私はそれを明示的にUpdateLayout()だけ呼び出していました。奇妙なこと... – Pwninstein

0

あなたの検証があなたのデータクラスにない理由はありますか? IDataErrorInfoを使用すると、すぐにデータを検証し、余分なことをすることなくUIにバブルさせる必要があります。

これは私たちのために働くので、私は言うべきですが、我々はWPFを使用しません。

+0

常に可能なのかどうかはわかりません(自分のデータクラスの検証)。私はWCFとWPFを使用するプロジェクトに取り組んでおり、WPFクライアントが使用するクラスはWCFコントラクトから自動生成されます。そのバリデーションも自動生成する方法がない限り、私は上に示したように何かをやっていると思います。私を間違っていると証明してください! – Pwninstein

+0

ああ、WCFはすべてを変える。 WCFサービスからデータを取得している場合は、datacontextで直接作業していません。 WCFをASP.Netアプリケーションに使用したとき、WCFサービスはデータプロバイダになり、データ検証が行われたビューモデルクラスを作成しました。これらのクラスはデータを取得し、IDataErrorInfoを使用してエラーをASP.Netページに渡します。 – TheCodeMonk

0

DataContextの設定時に検証が実行されない理由は、WPFがターゲットからの値(AKA、テキストボックスが変更され、それに応じてソースが更新される)で値が更新された場合にのみ検証を実行するためです。

DataContextを設定するときにデータを検証するには、論理ツリーを反復処理する必要があり、検証を実行するすべての要素について、そのBindingExpressionを取得してから、式のUpdateSourceメソッドをバインドします。それは検証を強制するでしょう。そのような何かをする

コードは次のようになります。検証ルールにより、

private void ValidateData() 
    {    
     //The XAML file defines a group of TextBox elements inside a Grid called grd 
     foreach (UIElement uie in grd.Children) 
     { 
      if (uie.GetType() == typeof(TextBox)) 
      { 
       ((TextBox)uie).GetBindingExpression(TextBox.TextProperty).UpdateSource();   
      } 
     }      
    } 
関連する問題