私はTextBoxを持つアプリケーションを持っています。フォーカスを得たら、ポップアップとしてカレンダーを表示する必要があります。MVVMのTextBox.GotFocus()イベントでカレンダーを表示
私の質問は、GotFocusイベントを購読し、カレンダーをビューモデルで表示する方法です。
私はTextBoxを持つアプリケーションを持っています。フォーカスを得たら、ポップアップとしてカレンダーを表示する必要があります。MVVMのTextBox.GotFocus()イベントでカレンダーを表示
私の質問は、GotFocusイベントを購読し、カレンダーをビューモデルで表示する方法です。
しかしあなたがきれいなコードビハインドファイルを持っていると主張した場合、以下の
を行うあなたが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プロパティにバインドされたプロパティを持つ必要があり、内部の可視に変更しメソッドによって呼び出されます。
実際には、これを行うために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}" />
ここでの主な質問は、なぜあなたの 'ViewModel'に純粋なUI機能(ポップアップを表示)を実装したいのですか?ここで純粋なUIの変更を扱っているので、 'Popup'の可視性を' true'に設定するための 'GotFocus'イベントをキャッチすることは、MVVM環境ではまったくそのトリックを行うべきです。 – Damascus
ここで私はダマスカスに同意します。テンプレートでトリガーを使用してポップアップを開くのが好ましい方法だと思います。 IsFocusedまたはIsKeyboardFocusWithinへのバインド(私は思う)は行く方法です。 – jjrdk
@ダマスカス私はあなたの意見に同意しました。私の問題は、カレンダーを表示した後、ViewModelに反映させ、テキストボックスにTextとして選択した日付を表示する必要があるカレンダーの変更(日付選択)です。どのようなアイデアでも、おしゃべりになるでしょう。 – Syed