2009-12-30 5 views
4

MVVM 질문. ViewModel과 View 간의 메시징은 어떻게 구현되는 것이 가장 좋습니까?MVVM ViewModel에서 메시징보기

응용 프로그램에는 다음과 같은 몇 가지 "사용자 통신"요점이 있습니다. "이 선택에 대한 의견을 입력했습니다. Yes/No/NA 선택 값이 변경되면 저장 또는 폐기 하시겠습니까? " 그래서 ViewModel의 "메시지"에 대한 View 바인딩의 일부 금지 된 방법이 필요합니다.

MVVM Foundation의 Messenger로 시작하는 경로가 다운되었습니다. 그러나 이것은 시스템 전반의 브로드 캐스트보다 이벤트/가입자 모델에 더 가깝습니다. 따라서 앱에 View (Person1 EditView 및 Person2 EditView) 인스턴스가 두 개 열려 있으면 한 ViewModel이 "저장 하시겠습니까?"라는 메시지를 게시 할 때 둘 다 메시지를 가져옵니다.

어떤 접근 방식을 사용 했습니까?

감사 앤디는 "통신"에 대한 귀하의 방법으로 바인딩을 사용하는 것이이 모든 내용은

답변

5

. 예를 들어, ViewModel에 설정된 속성에 따라 확인 메시지가 표시되거나 숨겨 질 수 있습니다.

다음은보기

<Window.Resources> 
    <BoolToVisibilityConverter x:key="boolToVis" /> 
</Window.Resources> 
<Grid> 

<TextBox Text="{Binding Comment, Mode=TwoWay}" /> 
<TextBlock Visibility="{Binding IsCommentConfirmationShown, 
         Converter={StaticResource boolToVis}" 
      Text="Are you sure you want to cancel?" /> 

<Button Command="CancelCommand" Text="{Binding CancelButtonText}" /> 
</Grid> 

입니다 그리고 여기 당신의 ViewModel

// for some base ViewModel you've created that implements INotifyPropertyChanged 
public MyViewModel : ViewModel 
{ 
    //All props trigger property changed notification 
    //I've ommited the code for doing so for brevity 
    public string Comment { ... } 
    public string CancelButtonText { ... } 
    public bool IsCommentConfirmationShown { ... } 
    public RelayCommand CancelCommand { ... } 


    public MyViewModel() 
    { 
      CancelButtonText = "Cancel"; 
      IsCommentConfirmationShown = false; 
      CancelCommand = new RelayCommand(Cancel); 
    } 

    public void Cancel() 
    { 
      if(Comment != null && !IsCommentConfirmationShown) 
      { 
       IsCommentConfirmationShown = true; 
       CancelButtonText = "Yes"; 
      } 
      else 
      { 
       //perform cancel 
      } 
    } 
} 

이 전체 시료가 없습니다 (유일한 옵션은 '예! :)), 그러나 희망이 당신의보기 것을 보여 ViewModel은 거의 하나의 엔티티이고 둘은 서로 전화를 걸지 않습니다.

희망이 도움이됩니다.

+0

그래 그 방향이다 나는 가고 싶어합니다. 그냥 조금 공식화 할 수 있습니다. 덕분에 – TheZenker

+0

괜찮아요 ... 공식화와 행운을 빌어 요. –

2

앤더슨이 설명하는 특정 요구 사항에는 충분할 수 있습니다. 그러나 Expression Blend Behaviors은보기 모델과보기 간의 상호 작용을 강력하게 지원하며 더 복잡한 시나리오에서 유용 할 수 있습니다. '메시지'에 대한 바인딩을 사용하면 지금까지만 표시됩니다.

참고 blend SDK는 자유롭게 사용할 수 있습니다. SDK 또는 동작을 사용하기 위해 Expression Blend를 사용할 필요가 없습니다. Blend IDE에는 동작을 '끌어서 놓기'위한 더 나은 내장 된 지원 기능이 있습니다.

또한 각 '동작'은 구성 요소입니다. 즉, 확장 가능한 모델입니다. SDK에는 몇 가지 기본 제공 비헤이비어가 있지만 독자적인 비헤이비어를 작성할 수 있습니다.

다음은 몇 가지 링크입니다. - (참고, URL에 '실버'는 당신을 오해하지 않는 행동이 모두 WPF와 실버 라이트에 대한 지원) :

information

Blend SDK

video on behaviors

+0

나는 행동에 대해들은 적이 있지만 아직 조사하지는 못했다. 팁 주셔서 감사합니다, 나는 그것을 체크 아웃합니다. – TheZenker

관련 문제