2010-05-06 7 views
0

복잡한 모델을 포함하는 ViewModels은 어떻게 서로 관계가 있습니까?MVVM - 작업 영역의 여러 작업 영역이 의미가없는 것처럼 보입니다

NO WPF 제자가 지금까지 그것에 대해 말하지 않았다

추측 왜 수 ...

당신은 그게 전부 사실을 생각하십니까은?

나를 이해하지 못하겠습니까?

다음을 확인합니다 CustomerViewModelOrderViewModel 많은 그 많은 ProductViewModel 있습니다.

당신은 3 작업 영역 모든 3 ViewModels에 대한 새로운 데이터를 입력해야하고 사용자가 입력 => customerVM s, orderVM들과 productVM`s의 컬렉션을 다중 선택하는 3리스트 박스/combobo/데이터 그리드 있습니다.

새로운 사용자/주문/제품이 추가 될 때마다 작업 공간을 켜거나 끌 필요가없는 사용자에게 UI가 적합하다는 사실은 사용자 경험이 나쁜 것인데,이 전형적인 LOB 애플리케이션 요구 사항을 어떻게 수행합니까?

편집 :

당신은 MVVM 입력 작업 공간의 컬렉션이있다. 모든 ViewModel은 WorkSpace 클래스에서 파생되므로 Workspace가 될 수 있습니다. 작업 영역 컬렉션은 ItemsSource afair josh smith 예제에 바인딩됩니다.

: 나는 goold 성숙 창을 사용하려면 사용자 인터페이스없이 폐쇄 viewmodels을 ... 형성 문제하십시오 CustomerviewModel 이미 인스턴스화해야하기 때문에 MVVM은 작업 공간 (폐쇄 나던 문제 ...)로 작업 할 수 있습니다 그런 다음 데이터 유형에 따라 itemsControl 및 datatemplated에 바인딩 된 작업 영역 컬렉션에 추가됩니다.

MVVM의 ViewModel이 모델을 생성자 매개 변수로 사용하기 때문에 내 ViewModel 인스턴스를 보유하고있는 작업 공간이 없으면이를 데이터 형식화 할 수 없습니다. CustomerViewModel의 DataType을 사용하여 UserControl을 DataTemplating하면 XAML에 예외가 발생합니다!

지금 내가 가지고 싶은 내 UI를 보면 : 나는 datatemplated에는 작업 공간 만 3 ViewModels = 3에 추가 된 UserControls 수단에 3 번 빅뱅이 없다 ...

이제 얻을 왜 MVVM을 좋아하지 않아? 그게 잘 생각하고 내가 솔루션을 검색 ...

ObservableCollection에서 내 ViewModels 일명 DataFormulars를 넣을 수 있지만 물론 그들을 ItemsControl에 바인딩 싶지 않아요. 나는이 3 UserControl 내 레이아웃에서 특정 위치를 가지고 싶습니다. ItemsControl을 사용하면 새로운 Dataformular가 방금 추가되고 기존 공간에 맞지 않는 경우 포장 된 바보 큐가 있습니다. 그게 전부 쓰레기 레이아웃 디자인/나쁜 UI입니다.

지금 나 한테 주시겠습니까?

답변

2

각기 다른 ViewModel에 바인드 된 여러 컨트롤을 하나의 창에 쉽게 가질 수 있습니다.VM 간을 조정하기위한 일반적인 접근 방법은 메시지 전달을 사용하여 여러 구성 요소를 느슨하게 결합하는 것입니다. 예를 들어 고객의 ViewModel에서 주문을 선택한 다음 OrderViewModel (기본 창에서 컨트롤로 시각화 한 것임)이라는 메시지를 보내 메시지를보고 표시된 주문을 변경할 수 있습니다.

각 VM에 주입하는 인터페이스를 제공하는 공유 서비스 클래스와 비슷한 기능을 수행 할 수 있습니다. 그런 다음이 공유 인터페이스의 속성을 바인딩하여 VM이 메시지와 동일한 방식으로 통신 할 수 있도록 할 수 있습니다. 필자는 다양한 객체 유형을 선택할 수있는 "SelectedObject"개념을 표현하기 위해 이와 비슷한 것을 사용했고, 내 앱의 다른 VM은 시각화하려는 방식이 다릅니다. 예를 들어 예를 사용하여 제품이 SelectedObject가되면 "표준"패널을 사용하여 표준 ProductDataTemplate을 사용하여 제품을 렌더링하고 다른 패널 (주문 표시)이 제품 목록의 SelectedItem을 변경합니다. 여러 '작업 공간'을 쉽게 가질 수 있으며 VM이 공동 작업하는 데 사용하는 속성 또는 메시지 집합을 사용하여 모든 작업 영역을 서로 동기화 할 수 있습니다.

+0

물론 창에는 viewmodel의 데이터 유형으로 데이터 형식화 된 여러 컨트롤이있을 수 있습니다. 그게 내가하는 말이 아니야. Product/Customer/Order가 포함 된 내 마스터 세부 정보 - - ViewModelcollection은 메시지 시스템의 정렬을 사용하여 문제를 해결하지 않고도 올바르게 작동합니다. VM 컬렉션에서 IsSynchronizedTocurrentItem을 사용하고 바인딩하면 모든 것이 올바르게 전환됩니다. 편집에 대한 자세한 내용은 위를 참조하십시오. – msfanboy

+0

너도 알다시피, 나는 부분적으로 틀렸어. 오늘 나는 사치 바버 (Sacha Barber)의 MVV 프레임 워크 인 Chinch를 확인했고 갑자기 눈을 떴다. 그는 CustomerViewModel에서 생성자를 사용하지 않습니다. 나는 이유를 알고있다 ;-) 그는 관련 주문과 제품을 로지 로딩한다. 나는 그것을 항상 AllCustomersViewModel에 바인딩 된 내 콤보 상자에 바인딩합니다. 문제는 관련 데이터를 지연/열망하는 것입니다. 게으른 로딩을 사용하는 경우 올바른 Dan 예를 들어 관련 CustomerViewModel을 DataGrid에 표시하기 위해 Messenger를 통해 선택한 CustomerViewModel을 다른 장소로 실행합니다. – msfanboy

+0

Chinch에서 본 내용을 충고하고 ViewMOdels 생성자 인 hurrraaayy XD를 킥 할 수 있도록로드 전략을 변경 한 것으로 보았 기 때문에 솔루션으로 쓴 첫 번째 단락을 봅니다. – msfanboy

관련 문제