2014-10-17 1 views
1

MVVM 환경에서 탐색을 구현하는 방법에 대해 this article부터 시작했습니다. 그런 다음 Messenger 클래스와 ViewModel간에 통신하는 것이 얼마나 유용 할지를 읽기 시작했습니다. 나는 메신저 클래스를 사용하여 동일한 탐색 개념을 구현하기 위해 밖으로 설정하고이 함께했다 :MVVM Light Messenger 클래스를 사용하는 올바른 방법입니까

MainViewModel : I 버튼에 콘텐츠를 제공하는 Name 속성이 해당 페이지 1 페이지 2 viewmodels에서

public sealed class MainViewModel : ViewModelBase 
{ 
    public MainViewModel() 
    { 
     PageViewModels.Add(new Page1ViewModel()); 
     PageViewModels.Add(new Page2ViewModel()); 

     Messenger.Default.Register<PageNavigationMessage>(this, (pageViewModel) => 
     { 
      switch (pageViewModel.CurrentViewModel.Name) 
      { 
       case "Page1": 
        CurrentPageViewModel = PageViewModels[0]; 
        break; 
       case "Page2": 
        CurrentPageViewModel = PageViewModels[1]; 
        break; 
      } 
     }); 
    } 

    private List<IPageViewModel> _pageViewModels; 

    public List<IPageViewModel> PageViewModels 
    { 
     get 
     { 
      if (_pageViewModels == null) 
       _pageViewModels = new List<IPageViewModel>(); 
      return _pageViewModels; 
     } 
    } 

    private IPageViewModel _currentPageViewModel; 

    public IPageViewModel CurrentPageViewModel 
    { 
     get { return _currentPageViewModel; } 
     set 
     { 
      if (_currentPageViewModel != value) 
      { 
       _currentPageViewModel = value; 
       RaisePropertyChanged("CurrentPageViewModel"); 
      } 
     } 
    } 

    private ICommand _changePageCommand; 
    public ICommand ChangePageCommand 
    { 
     get 
     { 
      if (_changePageCommand == null) 
      { 
       _changePageCommand = 
        new RelayCommand<IPageViewModel>(pn => Messenger.Default.Send(new PageNavigationMessage{CurrentViewModel = pn})); 
      } 

      return _changePageCommand; 
     } 
    } 

. 그러면 Page1 버튼과 Page2 버튼이 생성됩니다.

두 번째 페이지가 Name 속성 문자열을 제외하고는 거의 동일하기 때문에 Page1ViewModel 만 표시합니다.

public class Page1ViewModel : ViewModelBase, IPageViewModel 
{ 
    public string Name 
    { 
     get { return "Page1"; } 
    } 
} 

은 여기에 기본적인 PageNavigationMessage 클래스 구현이 매우 잘 작동

public class PageNavigationMessage 
{ 
    public IPageViewModel CurrentViewModel { get; set; } 
} 

을하지만이 MVVM 라이트 툴킷의 메신저를 구현하는 올바른 방법이 있는지 궁금 해서요.

자세한 게시물과 예를 보려면 위에서 언급 한 Rachel Lim의 블로그 게시물에 감사드립니다.

모든 의견, 제안 등을 높이 평가합니다.

답변

1

이것은 응용 프로그램에서 사용하는 것과 거의 같습니다.

우리는 또한 메신저를 위해 할 몇 가지 :

  • 은 모든 다른 메시지를 포함하는 일반적인 MessageTypes 클래스를 확인합니다. 대부분이 MessageBase의 상속을 가진 선언 일 뿐이므로 각 메시지의 클래스는 엉망이됩니다.
  • 클래스가 두 개 이상의 메시지를 등록한 경우 별도의 방법으로 메시지 등록을 다시 수정하여 메시지를 쉽게 추가/제거 할 수 있습니다.
  • 메시지의 논리가 두 줄 이상인 경우 일반적으로 그들은 여분의 방법으로, 그래서 예. 귀하의 예를 들어 그 것이다 :

public MainViewModel() 
{ 
    Messenger.Default.Register<PageNavigationMessage>(this, SetPageViewModel); 
} 

private void SetPageViewModel(IPageViewmodel selectedVm) 
{ 

    switch (selectedVm.CurrentViewModel.Name) 
    { 
     case "Page1": 
      CurrentPageViewModel = PageViewModels[0]; 
      break; 
     case "Page2": 
      CurrentPageViewModel = PageViewModels[1]; 
      break; 
    }  
} 
관련 문제