2011-01-10 4 views
1

이것은 MVVM에서의 첫 번째 시도입니다. 내 응용 프로그램의 핵심은 느슨하게 Josh Smith의 msdn 문서를 기반으로합니다. 그리고 mvvm light 프레임 워크도 사용하고 있습니다.wpf mvvm 명령을 사용하여보기 모델간에 매개 변수 전달하기

저는 명령 목록 영역과 사용자 정의 컨트롤/뷰를 탭 항목으로 표시하는 작업 영역을 포함하는 주 창이 있습니다. 각 사용자 정의 컨트롤에는 해당 뷰 모델이 있습니다. 메인 윈도우는 또한 내 명령 목록을 포함하는 뷰 모델을 가지고 있으며, 작업 공간 뷰 모델은 기본 작업 공간 뷰 모델을 가지고 있습니다.

내 기본보기에는 선택한 항목을 하나씩 가질 수있는 MappingSet의 마스터 DataGrid가 있습니다. 명령은 선택한 항목을 기반으로 MappingSet 상세 정보를 처리하는보기로 새로운 tabitem을 실행합니다. View/ViewModel은 사용 된 명령에 따라 기존 데이터가없는 새로운 MappingSet을 생성하는 tabitem 또는 편집을 위해 선택된 항목의 세부 사항을 포함하는 tabitem 또는 선택한 항목을 상세하게 포함하는 tabitem을 반환해야합니다. 새로운 MappingSet의베이스

씬을 설정했는데, 내가 해결할 수 없었던 것은 위에서 언급 한 세 가지 상태 중 하나에서 내 viewmodel을 인스턴스화하기 위해 선택된 MappingSet 객체의 식별자와 같은 매개 변수를 전달하는 명령 종속적 인 방법입니까? 예를 들어 mvvmlight 메신저가이 작업에 적합할까요?

답변

1

이것은 메신저/이벤트 통합 자에게 완벽한 시나리오입니다. 그러나 메시지 체인이 약간 복잡 할 수 있습니다. 내가 이해하고있는 바에 따르면, 메인 윈도우는 명령 목록 (예 : 메뉴 또는 리본)을 가지고 있습니다. 여기에 사건의 사슬을 보는 방법이 있습니다.

  1. 당신은 데이터 그리드에서 MappingSet을 선택, 이것은 MappingSetSelected 메시지가
  2. 메인 윈도우가 해당 메시지를 수신 (선택 MappingSet의 페이로드) 발사되도록 현재 선택된 MappingSet
  3. 를 저장 사용자가 버튼을 클릭하면 "EditMappingSet"또는 "CreateNewMappingSet"메시지가 발생합니다 (또는 창에서 새보기를 작성하는 경우 자체 작성).
0

옵션이 3 개인 경우 세 가지 다른 명령에 바인딩 할 수 있으며 명령 내에서 자체 정의 된 변수를 전달할 수 있습니다.

private RelayCommand _openMappingSetCommand; 

//Command that one of your options is bound to 
public ICommand ViewMappingSetOption1 
    { 
     get 
     { 
      if (_openMappingSetCommand == null) 
      { 
       _openMappingSetCommand = new RelayCommand(param => this.DoTabRequest("your parameter"); 
      } 
      return _openMappingSetCommand ; 
     } 
    } 


// Method that creates your viewmodel 
private void DoTabRequest(parameterType parameter) 
    { 
     WorkspaceViewModel viewModel = null; 

     if (viewModel == null) 
     { 
      viewModel = (WorkspaceViewModel)Activator.CreateInstance(typeof (viewModelType), parameter); 
      this.Workspaces.Add(viewModel); 
     } 

     this.ActiveWorkspace = viewModel; 
    } 

그런 다음 해당 매개 변수를 viewmodel의 생성자에 허용하고 그에 따라 필요한 모든 작업을 수행하십시오.

+0

내 솔루션은 메신저를 결합하여 명령을 보유한 mainWindow View 모델에 데이터를 제공 한 다음 명령으로 실행 된 ViewModel에 매개 변수로 전달합니다. 그래서 Steve와 Mike의 답변이 합쳐졌습니다. –

관련 문제