2014-04-11 8 views
4

새 창을 어떻게 열어야합니까? 나는 현재 다음과 같은 일을하고있다.ViewModel에서 새 창 열기

EventArgs입니다 :

public class GenericViewRequestedEventArgs : EventArgs 
{ 
    public GenericViewModel ViewModel { get; private set; } 

    public GenericViewRequestedEventArgs(GenericViewModel viewModel) 
    { 
     ViewModel = viewModel; 
    } 
} 

뷰 모델 :

public class MainWindowViewModel : ViewModelBase 
{ 
    private RelayCommand _viewSpecificCommand; 

    public ICommand ViewSpecificCommand 
    { 
     get 
     { 
      if (_viewSpecificCommand == null) 
       _viewSpecificCommand = new RelayCommand(x => viewSpecific()); 

      return _viewSpecificCommand; 
     } 
    } 

    public EventHandler<GenericViewRequestedEventArgs> GenericViewRequested; 

    private void RaiseGenericViewRequested(GenericViewModel viewModel) 
    { 
     var handler = GenericViewRequested; 
     if (handler != null) 
      handler(this, new GenericViewRequestedEventArgs(viewModel)); 
    } 

    private void viewSpecific() 
    { 
     RaiseGenericViewRequested(_specificViewModel); 
    } 
} 

보기 :

public partial class MainWindow : Window 
{ 
    private void OnGenericViewRequested(object sender, GenericViewRequestedEventArgs e) 
    { 
     GenericWindow window = new GenericWindow(e.ViewModel); 
     window.ShowDialog(); 
    } 
} 

이 수행 작업,하지만 코드의 많은 것 같아 난 뒤에 코드와 끝까지 내 관점에서 어떤 방식 으로든.

  • viewmodel에 명령을 보내는 것의 논리는 무엇입니까?
  • 선택적으로 조건부를 선택적으로 사용하고 (그렇다면 Enabled로 바인드하지 않는 이유) 속성으로 추가 뷰 모델 노출을 피할 수 있습니까?
  • XAML에 간단한 이벤트 처리기를 연결해야합니까 (예 : Click="btnViewSpecific_Click")?
+1

대화 상자를 열려면 다음과 같이하십시오. http://stackoverflow.com/questions/3801681/good-or-bad-practice-for-dialogs-in-wpf-with-mvvm – blindmeis

답변

2

예, MVVM에 대한 추가 코드가 많이 있습니다. UI 구성 요소를 포함하지 않고 명령 및 ViewModel을 단위 테스트 할 수 있도록 일반적으로 뷰와 독립적 인 명령을 단위 테스트 용으로 작성합니다.

그러나 "명령"이 창을 여는 것만으로는 명령을 만들 가치가 없으며 명령을 사용하여 GenericViewRequested가 실제로 실행되는지 확인할 수 있습니다 (정확한 _specificViewModel이 반환되는지 확인할 수도 있습니다).). 코드는 훨씬 복잡하고 가치는 거의 없습니다. 보기 버튼의 이벤트 핸들러에서 창을 열면됩니다.

1

좋은 예를 보려면 의 ViewModel (EmailClient) 샘플 애플리케이션에서 어떻게 작동하는지 확인하십시오.

5

"엄격한"MVVM 패턴을 따르는 방법에 따라 다릅니다. 이것은 MVVM의 기본 함정 중 하나에 불과하며 사용자의 취향에 따라 해결할 수 있습니다. 한 가지 방법은 단순히 코드 숨김을 사용하는 것입니다. 그렇다면 응용 프로그램 전체의 명령, 키보드 단축키 등을 어떻게 처리 할 것입니까? 그것은 너무 근시안적인 이모입니다.

나는 적어도 몇 년 전에이 문제를 해결 한 기존 프레임 워크를 사용해야한다고 생각하고 귀하의 응용 프로그램에 대한 견고한 기반을 제공 할 것입니다.

예를 들어, Catel에는보기 모델을 기반으로하는 창을 표시 할 수있는 IUIVisualizerService이 있습니다. 가장 큰 장점은 데이터를 뷰 모델에 푸시하고 결과를 서비스로 응답 할 수 있다는 것입니다. 또 다른 장점은 IUIVisualizerService를 조롱하면 대화 상자에서 제공되는 다른 결과에 반응하는 코드를 테스트 할 수 있다는 것입니다.

** 면책 **

내가 Catel의 개발자입니까, 그래서 방법이 여기에 Catel을 설명했다. 다른 사람이 다른 프레임 워크에 대해 의견을 말하고 싶다면 자유롭게 의견을 말하거나 새로운 대답을 만드십시오.

+0

안녕하세요. 그래서 나는이 해결책을 찾으려고 노력하고 있지만 나는 물어야한다. 이 작업은 뷰와 ViewModel이 별도의 프로젝트에있는 솔루션과 함께 사용할 수 있습니까?나는 지금까지 문서화 작업을 해왔지만 많은 기쁨을 얻지 못했습니다. – Offer

+0

그래, 차이를 만들어서는 안된다. 단지 로케이터와 명명 규칙이 올바르게 설정되었는지 확인해야한다. –