2011-03-23 1 views
0

더 복잡한 MVVM 시나리오의 좋은 예를 찾고 있습니다 ...하나의보기에서보기 모델/엔티티 또는 여러보기 모델을 여러 번 볼 수 있습니까?

플레이어의 컬렉션이있는 PlayersViewModel이 하나 있다고 가정합니다. 한보기에서 나는 플레이어 컬렉션을보고 추가/편집/삭제합니다.

다른보기는 Players 팀을 지정하는 팀입니다. 그래서 또 다른 뷰 모델 - TeamsViewModel이 있습니다. 이보기에는 또한 플레이어 모음이 필요합니다. 두 플레이어 목록을 동기화하여 유지하면 두보기 모두에 변경 사항이 표시됩니다.

나는 여러 옵션을 참조하십시오

  1. (TeamsViewModel에 대한 참조뿐만 아니라) 내 팀보기로 PlayersViewModel에 대한 참조를 추가하고
  2. 가 있나요 두보기에 PlayersViewModel.Players 모음을 사용하여 같은 기본 컬렉션 인스턴스를 참조하는 다른 컬렉션
  3. 컬렉션을 반환하는 Player.All과 같은 Player 모델에 정적 속성을 만들고 Player는 Player.Add (player), Player.Delete 등으로 뷰 관리자를 관리합니다. PlayersViewModel.AddPlayer (player) 대신에?

저는 현재 팀 전체보기와 두 가지보기 모드를 호출 할 수 있도록 앱 전체 리소스를 사용하는 경향이 있습니다. 그렇다면 선택된 Players를 My TeamsViewModel의 PlayersViewModel.Players 컬렉션에서 어떻게 사용하여 추가 할 수 있습니까?

도움말주세요.

답변

1

내 견고한 규칙은보기마다 하나의 ViewModel이므로 내 책에서 올바른 길을 가고 있습니다. PlayersViewModel과 Players 데이터를 혼동하지 마십시오. PlayersViewModel은 Players 데이터가 아니라 Players 뷰를 지향합니다. 다른 말로 표현하자면 두 개는 분리되어 있으므로 다른 ViewModel에서 PlayersViewModel을 다시 사용할 필요가 없습니다. 잘 설명하지 않으면 사과드립니다 ...

데이터의 동일한 인스턴스와 함께 표시하려면 여러 ViewModel이 필요하면 문서 수준이 아닌 App 수준에서 데이터를 정의하십시오. Players Static을 만들 수도 있고 Singleton 패턴을 구현할 수도 있습니다. ViewModel은 리소스를 소비하기 때문에 ViewModel에만 해당되는 것이 없습니다.

+0

조엘 감사합니다. 나는이 방향으로 나아가고 있으며, 뷰 모델을 제 견해에 열심히 그리고 빠르게 매핑하고있는 것처럼 보입니다. 필자의 뷰 모델은 꽤 크다. 따라서 필자는 현재의 Players 컬렉션과 같은 지능형 데이터 저장소와 같은 뷰 모델과 엔티티 프레임 워크 객체와 함께 다른 서비스가 필요하다. 그것은 EF가 나를 위해 무엇을해야하는지에 관해 어딘가에서 여기에서 두 배가되는 것처럼 보일지라도. – DaveO

+0

ViewModel에서 필요로하는 클래스에 액세스 할 수있는 서비스 계층을 추가하는 것이 좋습니다. 서비스는 DI로 셋업 할 수있는 EF에 대한 저장소 패턴을 사용할 수 있으며 위에서 논의한 다른 방법 중 하나를 사용할 수 있습니다. VM이 모든 EF 작업을 수행하면 안되며, VM이 수행하는 계층과 통신해야합니다. –

0

단일 ViewModel을 사용하십시오. 다른 견해에 필요한 것만 표시하도록하십시오. 플레이어 컬렉션과 관련하여 WPF를 사용하면 동일한 컬렉션에 대해 여러 개의 뷰를 가질 수 있으며 각 뷰에는 서로 다른 필터링/정렬/그룹화 뷰가 있습니다. Binding to Collections을 참조하십시오.

+0

PlayersViewModel과 TeamsViewModel을 하나의 뷰 모델로 결합한다는 의미입니까? 또는 Player 컬렉션을 참조하는 데 동일한 viewmodel을 사용합니까?내 TeamsViewModel에서 Player 컬렉션 (또는 현재 선택된 목록 뷰 선택 항목)에 액세스하는 방법을 아직 모르겠습니다 (결합하지 않은 경우). 감사! – DaveO

+0

예, 두 개의 뷰 모델을 결합해야합니다. 선택 항목의 경우,보기 모델에 속성을 추가하고 플레이어보기 (SelectedItem = {Binding SelectedPlayer})에 속성을 바인딩하는 것이 좋습니다. 물론 이것은 단일 선택 모드에만 해당됩니다. 나의 영어를 위해 유감스럽게 생각한다 :). –

+0

하나의 뷰 모델에서 선택에 문제가 없습니다. 그러나 이것이 어떻게 확장됩니까? 나는. 플레이어와 함께 내 뷰 모델에 팀 컬렉션이 생겼습니다. 일치 항목 컬렉션이 필요한 경우 뷰 모델에도이 컬렉션을 넣을 수 있습니까? 이것이 앱 전체에 대한 하나의 슈퍼 뷰 모델로 이어지지 않습니까? 감사! – DaveO

0

개인적으로 이해하기 쉽도록보기 당 하나의보기 모델이 있습니다. 이것은 각 사용자 정의 UserControl이 고유 한 ViewModel을 가지며 자체 작업을 처리한다는 것을 의미합니다. 많은 뷰가있는 꽤 큰 프로젝트에서 작업하고 있는데 뷰 당 하나의 ViewModel을 갖는 것이 더 깔끔한 방법이라고 생각합니다. 내 아키텍처를 올바르게 읽는 데 도움이되므로 고유 한 ViewModel에서 역할을 혼합하지 않습니다.

그러나 최선의 방법이라고 보장 할 수는 없습니다. 2 주 전 WPF/MVVM에서 작업하기 시작했습니다.이 방법으로 이해하는 것이 더 쉬울 것이라고 생각했습니다. (유지하기가 쉽기 때문에 가능한 한 많은 클래스로 프로그램을 분할하는 데 사용되었습니다)

관련 문제