0

テンプレート列のあるデータグリッドがあり、そのテンプレートにはテキストボックスがあります。これは、itemssourceを構成するコレクション内のオブジェクトの「Quantity」プロパティにバインドされています。数量は整数です。データグリッドにアイテムを追加すると、アイテムのPropertyChangedイベントにイベントハンドラーが追加されます。

EnteredPart.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(p_PropertyChanged);

これは、ユーザーがテキストボックスに整数を入力すると正常に機能します... p_PropertyChangedハンドラーが起動し、ボタンを無効にして、必要に応じて数量を変更できます。ユーザーが非整数を入力しても、ハンドラーは呼び出されず、テキストボックスの周りに赤いアウトラインが表示されます。このため、必要なときに必要なボタンを無効にすることはできません(数量が合法でない場合は無効にする必要があります)。これについて何かできる方法はありますか?

編集: Quantityプロパティを文字列に変更しようとしましたが、これにより、非整数値が入力されたときにプロパティ変更ハンドラーが呼び出されました。ただし、テキストボックスに検証を追加してこれを確認し、Validateメソッドがfalseを返した場合、プロパティ変更ハンドラーは再びヒットしなくなります。検証とプロパティ変更の両方の通知を受け取る方法はありますか?

編集2:ここで私が抱えているこの問題の別の例を別の場所で。電話番号を追加/編集するためのフォームがあります。電話番号のテキストボックスは次のようになります。

  <TextBox >
       <TextBox.Text>
           <Binding Path="Phone.Number">
               <Binding.ValidationRules>
                   <local:PhoneValidationRule />
               </Binding.ValidationRules>
           </Binding>
       </TextBox.Text>
   </TextBox>

保存ボタンをクリックしたら、ビューモデルで番号が有効かどうかを確認する必要があります。有効でない場合は、保存コマンドを実行したくないためです。ただし、検証が失敗した場合、Phone.Numberプロパティの値がnullになり、saveコマンドを実行する必要があるかどうかを確認する方法がないため、これを行う方法はないようです。エラー状態(Validation.GetErrorsで機能すると思いましたが、機能しない)にアクセスするか、ビューモデルでは使用できないテキストボックス内の実際のテキストにアクセスする必要があります。

4

1 に答える 1

0

念のために言っておきますが、MVVMアーキテクチャを使用している場合、ビュー部分での検証には多くの欠点があります。

ここで、ビューでモデルのコンテンツを確認しようとします。したがって、ビューでモデルを呼び出すことにより、MVVMのアーキテクチャを破壊します。

を使用IDataErrorInfoすると、MVVMの主な目的を達成するのに役立ちます(つまり、3つの部分を明確に分離します)。

ほんの一例:

ここでは、非常に小さな検証を実行していると思います(intかどうかを確認してください)。ただし、別の環境では、モデルがはるかに複雑で、より詳細な検証が必要であると想定します。を使用IDataErrorInfoすると、ビューからモデルを呼び出さなくても、モデルを詳細に確認できます。実際のところ、私の個人的な経験では、大規模で相関性の高いデータセットを定期的に使用してIDataErrorInfoいるため、提示されたすべてのデータを調査して潜在的なエラーを見つけるのにコストがかかりすぎるため、検証を使用して画像を作成することさえできません。

于 2011-06-16T13:54:28.703 に答える