2011-11-20 2 views
4

먼저 MVVM을 처음 사용하니 다음과 같이 도와주세요.ViewModels을 생성/가져 오기/캐시 할 위치는 어디입니까?

내 앱에 여러 개의 뷰가 있다고 가정 해 보겠습니다. 필자의 경우 편집기보기와 브라우저보기가 있습니다. 둘 다 편집중인 "노드"의 뷰 모델을 사용해야합니다.

그렇다면 실제로 뷰 모델은 어디에서 생성됩니까?

편집자에게 특정 노드를 편집하라는 메시지가 표시되면 새로운 "NodeViewModel"을 생성하고 작업 할 수 있습니다. 그러나 동시에, 사람들이 다른 노드를 바로 가기로 선택할 수있게 해주는 NodeBrowserView가 있습니다. 기본적으로 BrowserView와 동일한 ViewModel로 작업하려면 EditorView가 필요하므로 일반 "GetViewModelfor (X)"메서드가 필요합니다.

어떻게 작동하나요? :)

건배 :)

답변

1

당신의 편집기보기 및 NodeViewModel의 어떤 종류에서 작동한다 브라우저보기 모두. 다른보기 시나리오에 대해서만 별도의보기 모델이 필요하지 않습니다.

이제 사용자에게 표시되지 않는 노드를 편집 할 수 있습니까? 아니요 (사용자가 편집 된 내용을 결정할 때와 같이),보기 모델은 사용자에게 콘텐츠를 처음 제출해야 할 때 만들어야합니다. 대부분의 경우 이는 일부 브라우저/세부 정보보기이므로 사용자가 요소를 선택할 수 있고 인 경우을 선택하여 편집 할 수 있습니다.

편집 :

의견에 대해서는. 편집기보기NodeViewModel이 제공되어야합니다.

은 부분을 제공하며 예를 들어 constructor injection을 통해 또는보기의 데이터 컨텍스트를 수동으로 설정할 수 있습니다. 사용자가 브라우저보기의 모든 노드를 탐색 할 때 예를 들어, 그는 목록 항목 및 편집기 뷰를 더블 클릭 팝업됩니다

// this will probably be done in response to event 
private void ListItemDoubleClick(object sender, EventArgs e) 
{ 
    NodeViewModel currentItem = // extract current list item 
    EditorView editorView = new EditorView(currentItem); 
    editorView.Show(); 
} 

을 다른 방법으로, 이런 종류의를 피하려면 CompositeViewEditorView 사이의 강력한 결합은 항상 이벤트를 사용할 수 있지만 항상 필요한 것은 아닙니다.

디자인 측면에서 생각해 본 것 중 하나는 추가보기 모델을 추가하는 것이고 NodesListViewModel입니다.프로그램 흐름이처럼 보일 수 있습니다 방법 : 수, 응용 프로그램 시작시

  1. 당신의 노드는
  2. 노드 개체의 IList<Node> (목록에 의존 소요 NodeListViewModel의 인스턴스를 생성 (DB, 파일, 서비스, 아무것도에서 수))
  3. NodeListViewModel 구축하고
  4. 복합 뷰를 사용하여 주 프로그램 창,의 인스턴스를 생성 NodeViewModel 요소의 컬렉션을 노출합니다. 데이터 컨텍스트로 NodeListViewModel이 필요합니다.
  5. 사용자가 항목을 편집해야한다고 결정할 때마다 모든 준비가 완료됩니다. 브라우저에는 모두 NodeViewModels의 목록이 있으며 쉽게 현재를 집어 전용보기로 전달할 수 있습니다.
+0

정확하게 이해하면 반점이 있습니다. NodeViewModel은 처음 사용할 때 생성해야하지만 다른 뷰가 필요할 때 NodeViewModel을 사용하려면 동일한 뷰 모델을 사용해야합니다. 내 질문은 - MVVM 패턴에서 실제로 viewmodel의 생성/캐싱이 발생합니까? 편집기가 특정 노드를 편집하려고 결정하면 해당 노드에 대한 NodeViewModel이 필요합니다. CompositionBrowser가 이미 해당 노드로 재미 있었으면 Editor는 CompositionBrowser와 동일한 NodeViewModel을 사용해야합니다. 그렇다면 그들은 둘 다 뷰 모델을 얻게됩니까? – Pygmy

+0

@IUsedToBeAPygmy : 다소 일반적인 커뮤니케이션 관련 시나리오입니다. 편집을 참조하십시오. –

+1

또 다른 옵션은 EditorView를 리소스의 뷰 모델 유형에 대한 'DataTemplate'로 지정하고 컨텐츠로 뷰 모델이있는 새 창을 팝업으로 열어 보는 것입니다. 나머지는 automagic이 될 것입니다. – user7116

0

이 경우 나는 단일 기본보기 모델을 사용하고 대신보기가 연결되는 "현재 항목"을 선호합니다. 이것은 사용자가 다른 노드/그리드 행/등을 클릭 할 때마다 새로운 뷰 모델을 생성/생성하는 대신에 훨씬 쉽게 수행 할 수 있습니다. 실제로 동일한 작업을 수행 할 때 별도의 뷰 모델이 필요하지 않습니다. 전체보기 모델. 복잡성을 줄이고 개체 생성 (뷰 모델)의 변경을 줄이고 응용 프로그램을 닫을 때까지 개체 참조가 해제되지 않기 때문에 개체가 돌아 다니는 경우가 있습니다.

관련 문제