2011-08-14 19 views
1

私のアプリケーションでMVVMパターンを使用しています。私はUsercontrolのイベントを処理するためのいくつかの問題があります。VM内のユーザーコントロールイベントまたはMVVM内のビュー

DatePickerには、開始日と終了日の2つのテキストボックスと、特定の日付範囲のモデルからデータを取得するボタンが含まれています。

テキストボックスのいずれかにフォーカスすると、境界線の色を変更する必要があります(たとえば、緑色)。ユーザーが誤った日付値を再度入力すると、赤で境界線の色を変更する必要があります。

ユーザーが間違った日付の値を入力した場合は、このボタンも無効にする必要があります。

これらのイベントを処理するベストプラクティスは何ですか?

ありがとうございます。

:私は、ユーザーが開始日のテキストボックスがフォーカスされたときに、手動でも、カレンダーがポップアップとして表示され、彼/彼女は再びカレンダーを終了日テキストボックスに重点を置いたときに日付を入力することができ、ようにアプリケーションを修正開始日のテキストボックスで選択/入力された日付をブロックして表示されます。

残念編集が遅れています。

答えて

2

ユーザーの無効なデータに基づいてUIの外観を更新する必要がある場合は、Data Validationを調べる必要があります。ここに別のuseful linkがあります。

境界線の色を緑色に変更するには、スタイルの使用を検討する必要があります。残念ながら、現時点でこれをテストすることはできませんが、プロパティFocusVisualStyleを調べる必要があります。

MSDNのドキュメントには、それを言う:

は、外観、 効果、あるいはそれがキーボードフォーカスをキャプチャしたときに、この 要素に適用される他のスタイル特性のカスタマイズを可能にするプロパティを取得または設定します。

VSがインストールされたコンピュータに接続すると、FocusVisualStyleプロパティを使用して素晴らしいサンプルを取得できるかどうかを確認しようとします。私はまだそれを使用していないので、これは面白いはずです。 :O)

EDIT:オーケー

、あなたはこれに非常によく似たスタイルを使用することができます "焦点に、緑TextBoxの境界線をハイライト" のようにします。

<Window.Resources> 
     <Style TargetType="TextBox"> 
      <Style.Triggers> 
       <Trigger Property="IsFocused" Value="True"> 
        <Setter Property="BorderBrush" Value="Green" /> 
        <Setter Property="BorderThickness" Value="2" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </Window.Resources> 

私はとても緑への変更がより顕著になり2にBorderThicknessを増加させました。

+0

MVVMパターンでイベントを処理する場所に関する質問。どのようにあなたの答えをありがとう。 – Syed

+0

あなたの質問が正しく理解できれば、必ずしもイベントを作成する必要はありません。たとえば、境界線の色を変更したいのは、イベントではなくスタイルとして行うことです。無効な入力時に境界線の色を赤色に変更すると、データ検証が有効になります。 –

+0

イベントハンドリングをコードの背後に置くか、コマンドを使用するかを決定するのに問題がある場合は、チェックアウトする必要がある便利な質問があります:http://stackoverflow.com/questions/6137771/events-rather-than- commands-in-mvvm –

2

説明しているイベントを処理するためのベストプラクティスは、イベントを使用しないことです。スタイルを使用して、要素の視覚的外観を変更したり、ボタンを有効/無効にするコマンドを使用したり、不正なデータが入力されたときにコントロールの外観を変更したりできます。

ユーザーコントロールのイベントの使用例は引き続きあります。必要なときは、通常、イベントハンドラをコントロールのコードビハインドに置き、DataContextの既知のプロパティを設定して、イベントハンドラをビューモデルと通信させます。これを行うと、コントロールとビューモデル間の相互運用性の性質を明確にし、ユーザーコントロールが通信しているオブジェクトについて知る必要があるものを制限するインターフェイスを作成することをお勧めします。

+0

MVVMのパターンでは、「ビュー」にはイベント処理のためのコードが含まれているとも言えますか? – Syed

+0

たとえば、選択した項目をクリックするかF2キーを押してテキストを編集し、編集を中止するにはESCキーを押し、保存するにはEnterキーを押します。これを行うには、ビュー内でマウスアップイベントとキープレスイベントを処理する必要があります。ビューモデルは 'Text'プロパティと' IsEditingText'プロパティ( 'TextBox'か' TextBlock'が 'Text'を提示すべきかどうかを判断するために' ItemTemplate'のスタイルを使用します)を公開する必要があります。最終的に、これは 'IEditableText'インタフェースを実装するビューモデルでの使用のためのカスタムコントロールに発展します。 –

関連する問題