2012-01-04 5 views
4

각 뷰에는 2 개의 뷰 모델이 있습니다.어떤 형태의 viewmodel-viewmodel 통신을 사용하는 대신 2 개의보기 모델을 1로 결합해도 괜찮습니까?

번째 뷰 모델의 관점으로 만 1 속성 표시되어있다
PolicyProvider 

PolicyType 

PolicyNumber 

:

TypeOfInvestmentFund 

는 1가

제 뷰 모델 3 개 속성보기로 디스플레이되고있다 PolicyTypeTypeOfInvestmentFund.

사이의 많은 관계 이러한보기 모델과 뷰는 모두 사용자로 표시됩니다. 상위 폼 내부의 컨트롤.

TypeOfInvestmentFund에 사용할 수있는 선택 사항은 다른보기에 어떤이 선택되어 있는지에 따라 다릅니다. 이 결합 될 수있는 이러한 두 뷰 모델 같은 느낌이 나에게


때문에

A)가 명확 다소 컨트롤이 모두 너무 작고 간단

B)을 결합 그것들을 합치면 복잡하고 관리하기 어려운 물건을 만들지 못할 것입니다.

그러나이 데이터는 상당히 관련이 없습니다. 사용자가 여전히 양식의 별도 부분에 데이터를 표시하고 (따라서 별도의보기에 배치해야 함) 관련성이 충분하지 않습니다.

필자는 개인적으로이 2 가지 뷰 모델을 결합하고 2 개의 개별 뷰를 갖는 것이 서로 다른 부분을 표시하기 위해 뷰에 연결되어 있으면 2 개의 개체 사이의 통신을 관리하는 데 훨씬 적은 오버 헤드가 있다고 느낍니다.

그러나 프리즘 이벤트 수집기와 느슨하게 결합 된 이벤트를 만들 수는 있습니다.이 작업을 한 번도 해본 적이 없지만 관리하기가별로 쉽지는 않습니다.이 두 가지 뷰 모델을 개별적으로 유지하면 걱정의 분리가 유지됩니다. 또한 나중에 다른 컨트롤이이 정보가 필요한 개발 단계에 나타나면 계속 흡수 할 수 없기 때문에이 단계에서 이벤트 수집기를 시작하면 이벤트를 이미 구독 할 수 있으므로 재 작업을 막을 수 있습니다. 뷰 모델을 결합하는 것은 여전히 ​​더 많은 작업입니다.

이 2 개 중 어느 것이 더 정확합니까? 나는 그 심판의 부름을 이해하지만 결정할 수 없으므로 나는 내 마음을 결정하는 데 도움이되는 의견을 찾고있다.

답변

0

답장을 보내 주셔서 감사합니다. Rachels 제안 (당신을 위해 upvote)에서 많은 아이디어를 얻었다. 그러나 그들 중의 누구라도 밖으로 판잣 이니. 결국 프로젝트 관리자는이 아이디어가 마음에 들지 않아 가독성과 재 작업을 방지하기위한보다 표준적인 접근 방식을 구현하기를 원하므로 메시지 루트로 이동합니다.

대신 eventaggregator 난 그냥 Policy 자식의 PropertyChanged 이벤트를 구독하고 TypeOfInvestment 자식 속성을 변경할 수 있습니다.

필자는 실제로 나에게 더 의미가있는대로 뷰 모델을 병합하지 못했습니다.

1

이 문제는 데이터베이스 정규화와 매우 유사합니다. 한편으로, 정규화는 두 개의 분리 된 뷰 모델을 생성하는 것과 마찬가지로 좋은 습관입니다. 그러나 동시에 특정 양의 비정규 화 (denormalization)가 성능을 돕는 것으로 알려져 있습니다.

는 개인적으로 이들 2 개 뷰 모델을 조합 갖는 2 개 별도의 견해는 다음 두 개체 사이의 통신을 관리하는 훨씬 적은 오버 헤드가 다른 부분을 표시하는 데에 연결 느낀다.

그리고 그 진술은 모든 것을 말해줍니다.두 가지 뷰 모델을 결합하는 것이 "모범 사례"로 간주되지 않을 수도 있지만, 내가 당신에게서 얻는 느낌은 (언급 한 커플 링 및 복잡성의 수준을 기반으로 한) 응용 프로그램에 의미가 있다는 것입니다. 나는 그들과 결합하여 그것이 어떻게 수행되는지 계속 주시 할 것입니다.

+0

입력 해 주셔서 감사합니다. 불행히도 성능은 여기에서 유일하지 않습니다. 나는이 프로젝트에서 다른 사람과 이야기를 나눴다. 그녀는이 접근 방식의 문제점은 확장 성 (더 많은 이슈가 팝업되면 뷰 모델을 병합 유지할 수없는 질문에서 언급 한 것처럼)과 가독성이라고 말했다. 지금까지 모든 뷰는 뷰 모델을 가지고 있으며, 다른 누군가가 나중에 코드를 보면 매우 혼란 스러울 수 있기 때문에 뷰티 모델을 깨고 싶지 않습니다. 이벤트 수집기에 넣어야 할 것 같습니다. –

3

의 ViewModel이보기가 Policy 및 동적 TypeOfInvestmentFund을 표시하지 데이터

경우보기를 반영, 모든하여 뷰 모델은 이러한 개체를 모두 가지고 있어야 의미합니다.

개인적으로 나는 내 ViewModel에가보기에 Policy 모델을 노출해야하고, PolicyModelProvider에 대한 Type, Number을 속성을 포함해야하고, InvestmentFund

나는 그 방법을 각 개체를 그리는 WPF에게 DataTemplates을 사용할 수있는 것 . 여기에 당신이 그렇게 얼마나 윤곽을 거친 예입니다

<DataTemplate DataType="{x:Type local:PolicyModel}"> 
    <StackPanel> 
     <local:PolicyView /> 
     <ContentControl Content="{Binding InvestmentFund}" /> 
    </StackPanel> 
</DataTemplate> 

<DataTemplate DataType="{x:Type local:InvestmentFundA}"> 
    <local:InvestmentFundA /> 
</DataTemplate> 

<DataTemplate DataType="{x:Type local:InvestmentFundB}"> 
    <local:InvestmentFundB /> 
</DataTemplate> 

편집 두 개의 분리 된 객체는, 내가 그들의 Models 별도의 유지와 같은 ViewModel에서 둘 다 넣어 것 PolicyTypeOfInvestment 경우

. Models은 데이터 모델링 용이며 은 모델링 용입니다 View

+0

정확하게 이해한다면 뷰 모델 대신 모델을 결합하는 것이 좋습니다. 이것은 나를 위해 아마 wouldnt 일. 당신의 대답은 질문의 맥락에서 완전하게 나타납니다. 그러나 나는 그 예를 단순화 시켰다고 생각합니다. 문제의 데이터는 뷰와 뷰 모델이 실제로 작업하는 데이터는 아니지만 뷰 **에 대한 데이터입니다. 우리는 시스템을위한 자동 저장을 만들고 있으며 나중에로드 할 뷰의 상태를 저장하고 있습니다. 그리고 각보기가 독립적으로 수행 할 수 있기 때문에 (데이터를 별도로 유지해야 함) –

+0

@ExitMusic 첫 번째 비트는 여전히 적용되어야합니다.보기에 두 개의 다른 모델이 포함 된 경우 ViewModel에서 두 항목을 모두 가져야합니다. 보통 페이지 당 하나의보기가 있습니다. 하나의보기가 아닙니다. 모델 당보기 – Rachel

+0

사실은'Policy'와 또 다른 ** 별도의 **보기가있는'TypeOfInvestmentFund'가 있습니다. 두 뷰 모두 독립적으로 사용할 수 있습니다. 이러한보기가 usercontrols로 중첩 된 부모보기가 있습니다.나는 일반적으로 그것들을 하나의 뷰에 둘 것이지만, 그것들을 별도로 재사용 할 수 있기를 바란다. (때로는'Policy'를 바꾸길 원하지만'TypeOfInvestmentFund'를 사용하지 않아야한다.) 그래서 그들은 다른 관점에있게 될 것이다. 나는 그것이 의미가 있기를 바란다.^_^ –