2011-01-06 3 views
1

엔티티 (직원, 비즈니스 등)에 대한 하나 이상의 주소를 표시/관리하는 사용자 정의 컨트롤이 있습니다.MVVM/ViewModel/UserControl/DataContext/Command - 디자인 문제/토론

저는 컨트롤 내의 주소 UI를 캡슐화하여 다양한보기에서이 사용자 정의 컨트롤을 활용했습니다.

내가 잡고 몇 ViewModels이/여러 다른 관점에서 주소 수집 노출 - 그 각각 보통 내가 사용자에게 적절한의 DataContext를 통과 한

다른 뷰 모델 (각보기에 대한 하나의 ViewModel)에 의해 관리된다 즉, 주소 컬렉션을 노출하는 다양한 ViewModel이 있지만 DC 바인딩을 통해 적절한 컨텍스트를 전달할 수 있습니다.

내가 질문을 추가하고 제거하기 위해 Command Logic을 어디에 두어야합니까? 각보기 모델에서 동일한 명령을 넣지 않으려 고합니다. 간단히 코드를 반복하는 것입니다.

MVVM을 처음 사용하기 때문에 IAddressCommand 인터페이스로 클래스를 만들고 각 ViewModels에서 명령을 작성하면됩니까? 다른 ViewModel 내에 뷰 모델을 캡슐화합니까?

생각하십니까? 명령이 주소의 각 유형에 대한 동일한 경우 감사 리처드

답변

1

는 다음 주소 ViewModels 상속되는 기본 뷰 모델을 준비하십시오. 공통 명령 코드는 기본 클래스에 배치 할 수 있습니다.

+0

사운드는 좋지만 모든 ViewModels에 대한 기본 클래스가 있으며 다중 상속이 작동하지 않습니다! – codeputer

+0

@codputer 기존 'ViewModelBase'에서 상속받은 AddressViewModel을 도입 한 다음 기존 클래스를 상속하도록 변경할 수 있습니다. –

+0

작동하지만 CommandModel에서 직접 설정 한 명령 멤버와는 다른 구성 요소의 DataContext 문제가 개체 그래프의 다른 수준에서 설정됩니다. DataContext를 객체 그래프 위로 이동하면 필드 바인딩이 트리에서 더 깊은 레벨을 참조해야합니다. – codeputer

0

ViewModels : View와 관련하여 1 : 1 접근 방식이 필요하다면 이러한 구성 요소를 함께 묶을 수있는 서비스 (ViewModel 아님)를 제공하십시오. 그런 다음 ViewModel 내에서 기본 콜렉션에 주소를 추가/삭제하는 서비스를 호출하게됩니다. 이 서비스는 필요에 따라 여러 ViewModel에서 사용할 수 있습니다.

디자인을 조정하려는 경우; 하나의 ViewModel을 사용하거나 다시 스케일링하여 기본 컬렉션에서 주소를 추가/제거하고 여러 뷰에서 소비 및 사용할 수있게합니다.

IMHO는 첫 번째 경로를 진행하고이 작업 부하를 서비스로 추상화하는 것이 더 나은 접근 방법입니다. 어느 것이 든 충분할 것이다.

+0

명령 단추를 서비스에 바인딩하는 방법을 어떻게 제안합니까? DC는 바인딩 컨텍스트를 설정하고 명령 단추는 필드 바인딩보다 개체 그래프에서 더 높습니다. Firestarted의 ScottGu는 Silverlight 5에서 DC 트리를 바인딩하는 명령을 검색하는 Ancestor (?) 바인딩 절이있을 것이라고 언급했습니다.이 상황이 바로 새 절을 도입 한 이유입니다. – codeputer

+0

@codputer 현재와 마찬가지로 명령을 ViewModel에 바인딩합니다. 그러나 서비스를 호출 할 명령에 대한 조치 시점에 있어야합니다. 서비스 자체에 바인딩하지 마십시오. –