2014-09-16 3 views
0

이것은 다소 기본적인 질문이라고 생각하지만 이에 대한 대답을 찾을 수 없었습니다.WPF MVVM 응용 프로그램에서 상속과 마스터 - 세부 관계

다음과 같은 시나리오가 있습니다 : 어떤 형태의 EntityFrameWork도 사용하지 않고 PersonViewModel과 PersonViewModel을 가지며 PersonViewModel에서 상속받습니다. PersonView에서 Grid에 PersonViewModel 콜렉션을 표시합니다. Name, DateOfBirth 등의 속성을 열로 사용합니다. 사람을 두 번 클릭하면 PersonDetailsView에 대한 바운드 인 PersonDetailView가 나타납니다. 이보기에는 사람에 대한 추가 정보 (성별, 사회 보장 번호 등)가 있습니다. 사용자가 모든 속성을 수정하도록 허용했습니다.

이제 PersonViewModel이 PersonDetailsViewModel에서 편집 된 값으로 업데이트되었는지 확인하는 것이 가장 좋은 방법인지 궁금합니다.

몇 가지 옵션을 생각해 볼 수 있습니다. 처음에는 다른 ViewModel을 사용하지 않고 PersonDetailViewModels를 사용하여 그리드에 표시 할 수있었습니다. 단점은 ViewModel 당 많은 불필요한 데이터를 검색해야한다는 것입니다. PersonDetailsView가 닫힌 후에도 해당 속성을 동기화 할 수 있습니다. 내가 생각할 수있는 세 번째 옵션은 PersonView에서 상속하는 대신 PersonView 유형의 PersonView에 속성을 포함시키고 속성을 공개하고 PersonDetailsView에서 바인딩에 사용하는 것입니다. PersonDetailsViewModel의 다른 모든 추가 속성은 생성자에서 검색됩니다.

+0

MVVM을 Viewmodel First로 구현하고 INotitfyPropertyChanged를 구현하면 모든 PersonViewmodel에는 PersonDetailsViewmodel이 있으므로 아무 것도하지 않아도됩니다. – blindmeis

+0

일부 코드를 게시하면 귀하의 질문에 모두 답변하는 데 도움이됩니다. – blindmeis

답변

0

쉐리 던스 대답에 덧붙여.

내가 어떤 상속하지 않을 것입니다 위의 의견에 추가 :

public class PersonViewModel 
{ 
    public PersonDetailsViewModel Detail {get;set;} 
} 

은 다음 XAML가

<TextBlock Text="{Binding Detail.Gender}"/> 

EDIT1처럼 단순히 보이는 PersonDetailsViewModel 나는 유형의 속성으로 상세 노출 될 수 (그의 질문에 user1087702가 쓴 내용이 무엇인지). 나는 PersonVM과 PersonVMDetail의 두 클래스를 간단히 생성 할 것이다. 요청이 내 개인 객체의 세부 정보를 표시하려면 지옥에서 PersonVMDetail 유형의 PersonVM 클래스에 public 속성을 작성하면 안됩니다.이 요청을 채우려면?

+0

지금 당장이 접근법을 구현하는 것이 가장 쉽습니다. 실제로는 너무 직설적이어서, 나 자신을 생각하지 않는 것이 어리석은 느낌입니다. – dvanmil

1

제 경험상 동일한 데이터를 공유하는 뷰 모델을 업데이트하는 가장 좋은 방법은 Mediator 패턴을 사용하여 데이터가 업데이트되었다는 알림 메시지를 보내는 것입니다.

좋은 객체 지향 디자인을 위해서 우리는 서로 상호 작용하는 클래스 들인 을 만들어야 만합니다. 특정 원칙이 적용되지 않으면 최종 프레임 워크는 각 오브젝트가 실행하기 위해 다른 많은 오브젝트에 의존하는 전체 혼란으로 종료됩니다. 빡빡하게 결합 된 프레임 워크를 피하기 위해서 우리는 객체가 다른 객체의 존재를 인식하지 못하는 방식으로 객체 간의 상호 작용을 용이하게하는 메커니즘이 필요합니다.

소스 http://www.oodesign.com/mediator-pattern.html

그것은 알림 (데이터가 다시로드됩니다) 그 응답이 때문에 가 (데이터가 업데이트) 무슨 일이 있었는지와 을 발생해야하지 무엇을 말한다 설계 문법적으로 중요하다 시스템이 진화하면 그대로 유지되지 않을 수도 있습니다.

흔히 일반적인 MVVM 라이브러리에는 Mediator 구현이 있습니다. 예를 들어, Prism의 EventAggregator입니다.

+1

나는 Gusdor에 동의한다. 또 다른 간단한 설명은 이벤트 유도 형 아키텍처를 사용하여 특정 객체가 업데이트되었을 때 시스템의 나머지 부분에 알린다. – Ouarzy

+0

왜 사람 클래스에 대한 세부 정보를 보여주고 싶을 때 중재자 패턴을 사용합니까? Person 클래스 자체는 물론 detail 객체의 인스턴스를 가져야합니다. – blindmeis

+0

@blindmeis 상속 구조에서 연결 해제 알림을 받으면 카운터를 사용하면 구현이 장기적으로 당신을 괴롭히지 않을지에 대해 고민하지 않고 기능적 세부 사항에 집중할 수 있습니다. 마스터와 디테일은 서로 다른 기능을 가지고 있으며 SRP와 같은 느낌을줍니다. 꼭 공유 데이터에 플라이 웨이트를 사용하십시오. – Gusdor

0

PersonDetailsViewModel 인스턴스를 소요하고 일반적인 속성 갱신 당신의 PersonViewModel 클래스에 생성자를 추가하는 것입니다 귀하의 요구 사항을 달성하는 가장 간단한 방법 :

public PersonViewModel(PersonDetailsViewModel personDetailsViewModel) 
{ 
    Name = personDetailsViewModel.Name; 
    ... 
    DateOfBirth = personDetailsViewModel.DateOfBirth; 
} 

을 ...의

PersonViewModel = new PersonViewModel(PersonDetailsViewModel); 

물론 이것은 생성자에있을 필요가 없습니다 ...PersonViewModel 클래스의 메소드 일 수도 있고 별도의 팩토리 패턴 클래스의 도우미 메소드 일 수도 있습니다. 이는 여러분에게 달려 있습니다.

+0

다른 길은 없어야합니까? PersonViewModel을 사용하는 생성자를 갖는 PersonDetailViewModel을 의미합니다. – dvanmil

+0

이봐 요, 당신의 요구 사항입니다. 당신이 말했던 것입니다. *'PersonViewModel'이'PersonDetailsViewModel' *에서 편집 된 값으로 업데이트되도록 최선의 방법이 무엇인지 궁금합니다. 하루가 끝나면 속성 값을 복사해야합니다 ... 실제로 어떻게 또는 어디에서 작업하든 문제가되지 않습니다 ... 귀하의 책임입니다. – Sheridan

관련 문제