2011-08-05 4 views
1

TextBox를 사용하는 응용 프로그램이 있습니다. 초점을 맞출 때 캘린더를 팝업으로 표시해야합니다.MVVM에서 TextBox.GotFocus() 이벤트에 캘린더 표시

제 질문은 GotFocus 이벤트를 구독하고보기 모델을 통해 달력을 보여주는 방법입니다.

+0

여기에서 가장 중요한 질문은 'ViewModel'에 순수 UI 기능 (팝업 표시)을 구현 하시겠습니까? 'Popup'의 가시성을'true'로 설정하는'GotFocus' 이벤트를 잡는 것은 MVVM 환경에서 트릭을해야합니다. 여기서 순수한 UI 변경을 다루고 있기 때문에 – Damascus

+0

여기 다마스커스에 동의합니다. 선호하는 방법은 템플릿에서 트리거를 사용하여 팝업을 여는 것입니다. IsFocused 또는 IsKeyboardFocusWithin 바인딩 (제 생각 엔) 갈 길이 멀어 보인다. – jjrdk

+0

@Damascus 나는 당신의 요점에 동의했다. 내 문제는 캘린더를 보여준 후에 캘린더의 모든 변경 (날짜 선택)을 ViewModel에 반영하고 선택한 날짜를 텍스트 상자에 텍스트로 표시해야한다는 것입니다. 어떤 아이디어가 appriciated 것입니다 ... – Syed

답변

4

그것은

당신이 MvvmLight.Extras.WPF4이 필요합니다 다음은 깨끗한 코드 숨김 파일을 가지고 주장 할 수 있지만 경우, 이와 같은 뷰 특정 작업을 위해 코드 숨김 쓰기 상당히 허용됩니다. dll 및 System.Windows.Interactivity.dll 두 번째 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" 

당신이 당신의 달력 Visibility 속성에 바인딩 된 속성을 가지고 있어야 뷰 모델에 텍스트 상자

<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}" />