2011-08-05 9 views
1

私はTextBoxを持つアプリケーションを持っています。フォーカスを得たら、ポップアップとしてカレンダーを表示する必要があります。MVVMのTextBox.GotFocus()イベントでカレンダーを表示

私の質問は、GotFocusイベントを購読し、カレンダーをビューモデルで表示する方法です。

+0

ここでの主な質問は、なぜあなたの 'ViewModel'に純粋なUI機能(ポップアップを表示)を実装したいのですか?ここで純粋なUIの変更を扱っているので、 'Popup'の可視性を' true'に設定するための 'GotFocus'イベントをキャッチすることは、MVVM環境ではまったくそのトリックを行うべきです。 – Damascus

+0

ここで私はダマスカスに同意します。テンプレートでトリガーを使用してポップアップを開くのが好ましい方法だと思います。 IsFocusedまたはIsKeyboardFocusWithinへのバインド(私は思う)は行く方法です。 – jjrdk

+0

@ダマスカス私はあなたの意見に同意しました。私の問題は、カレンダーを表示した後、ViewModelに反映させ、テキストボックスにTextとして選択した日付を表示する必要があるカレンダーの変更(日付選択)です。どのようなアイデアでも、おしゃべりになるでしょう。 – Syed

答えて

4

しかしあなたがきれいなコードビハインドファイルを持っていると主張した場合、以下の

を行うあなたがMvvmLight.Extras.WPF4が必要になります、コードビハインドこのようなビュー固有のタスクのために書くことはかなり可能です。 dllとSystem.Windows.Interactivity.dllの2つ目のDLLは主にブレンドされ、最初はgoogleで、どちらの場合でもMVVMLightパッケージでそれらを見つけることができます。

次のようにそれらを参照:あなたのビューモデルの

xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WPF4" 

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 

あなたのテキストボックスを参照

<TextBox> 
<i:Interaction.Triggers> 
<i:EventTrigger EventName="GotFocus"> 
    <cmd:EventToCommand Command="{Binding showCalendar, Mode=OneWay}" MustToggleIsEnabledValue="True"/> 
    </i:EventTrigger> 
    </i:Interaction.Triggers> 
</TextBox> 

をあなたのカレンダーVisibilityプロパティにバインドされたプロパティを持つ必要があり、内部の可視に変更しメソッドによって呼び出されます。

1

実際には、これを行うためにViewModelに行く必要はありません.XAMLではとても簡単に行うことができます。 TextBoxのIsFocusedプロパティにバインドされているバインドにBooleanToVisibilityConverterを使用します。

  <TextBox x:Name="_textBox" Text="{Binding Text}" /> 
      <myNameSpace:Calendar Visibility="{Binding ElementName=_textBox, Path=IsFocused, Converter={x:Static _boolToVisibilityConverter}, Mode=OneWay}" />