2011-08-05 53 views
1

我有一個應用程序有TextBox。在獲得焦點時,我需要將日曆顯示爲彈出式窗口。MVVM中的TextBox.GotFocus()事件顯示日曆

我的問題是如何顯示訂閱GotFocus事件並通過視圖模型顯示日曆?

+0

這裏的主要問題是:爲什麼你要在你的'ViewModel'中實現一個純UI功能(顯示一個彈出窗口)?捕捉'GotFocus'事件以將'Popup'的可見性設置爲'true'應該完全可以在MVVM環境中實現,因爲您在這裏處理純UI更改 – Damascus

+0

我同意在這裏使用大馬士革。我會說首選的方法是在模板中使用觸發器來打開彈出窗口。綁定到IsFocused或IsKeyboardFocusWithin(我認爲)似乎是要走的路。 – jjrdk

+0

@Damascus我同意你的觀點。我的問題是,在顯示日曆之後,日曆中的任何更改(日期選擇)需要在ViewModel中反映,並將選定日期顯示爲文本框中的文本。任何想法都會被設計出來...... – Syed

回答

4

這是相當可以接受的編寫代碼隱藏視圖特定的這樣一個任務,但是如果你堅持有乾淨的代碼隱藏文件,請執行下列操作

你需要MvvmLight.Extras.WPF4。 DLL和System.Windows.Interactivity.dll,第二個DLL主要是混合,谷歌第一,並在任何情況下,你可以找到他們都在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

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

您的視圖模型,你應該有一個綁定到您的日曆可見屬性的屬性,將其更改爲可見裏面的方法由該命令調用。

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}" /> 
相關問題