문제

설명하는 가장 좋은 방법은 예제입니다.

이것이 모델입니다

public class Person 
{
    public int age;
    public string name;
}

이것은보기 모델입니다

public class PersonVM
{    
}

내 질문은 다음과 같습니다.
VM이 사람을 데이터 템플릿에 노출 시키거나 자신의 속성으로 모델 속성을 캡슐화해야합니까?

도움이 되었습니까?

해결책

보기 모델은 자체 속성을 선언하고보기에서 모델의 세부 사항을 숨겨야합니다. 이를 통해 가장 유연성이 가장 높으며 모형 유형 문제가 모델 클래스로 유출되는 것을 막을 수 있습니다. 일반적으로 View Model 클래스는 대표단으로 모델을 캡슐화합니다. 예를 들어,

class PersonModel {
    public string Name { get; set; }
}

class PersonViewModel {
    private PersonModel Person { get; set;}
    public string Name { get { return this.Person.Name; } }
    public bool IsSelected { get; set; } // example of state exposed by view model

    public PersonViewModel(PersonModel person) {
        this.Person = person;
    }
}

기억하십시오 : 모델은 그것을 소비하는보기 모델에 대해 아무것도 알지 못하고,보기 모델은 그것을 소비하는보기에 대해 아무것도 알지 못해야합니다. 견해는 백그라운드에 숨어있는 모델에 대해 아무것도 몰라야합니다. 따라서 뷰 모델에서 속성 뒤에 모델을 캡슐화합니다.

다른 팁

그 질문에 대한 일반적인 합의는 없습니다. 예를 들어 Ward Bell이 공식화 한 MVVM에 대한 공개 질문 중 하나였습니다. 여기:

VM이 V에 랩핑되지 않은 m-object (예 : 원시 직원)를 제공 할 수 있습니까? 아니면 M-Object의 속성 (속성이 허용되는 경우)이 VM 래퍼의 표면을 통해서만 노출되어야합니까?

VM에서 모델을 직접 노출시키지 않는 주요 장점은 다음과 같습니다.

  • "스테로이드의 변환기"로 사용할 수 있으며,보기를 위해 편리한 방식으로 모델 값을 형성 할 수 있습니다.

  • 사용자 인터페이스와 관련된 다른 기능을 주입 할 수 있습니다. 데이터 검증 메시지, 실행 취소 REDO,..

단점은 다음과 같습니다.

  • ViewModel의 모든 모델 속성을 노출시키기 위해 많은 코드를 복제해야합니다.

  • View Models 속성에 뷰 컨트롤을 바인딩하면 ViewModel에서 PropertyChanged 이벤트를 보냅니다. 그러나 모델 속성이 ViewModel Setter와 다른 다른 소스에서 변경되면 어떻게됩니까? 그런 다음 ViewModel에 알리도록해야합니다. 2 onpropertyChanged, 하나는 모델 중 하나와 ViewModel에서 하나로 끝납니다 ... 상당히 복잡합니다!

따라서 나에게 정답은 다음과 같습니다. 요구 사항에 따라 다릅니다.

이에 대한 흥미로운 해결책은 MSDN 볼륨 25의 Robert McCarter가 제안했습니다.

http://msdn.microsoft.com/en-us/magazine/ff798279.aspx

그는 동적보기 모델을 사용하여 모든 모델 속성을 프록시하지 않고 모델 위에 레이어를 제공합니다.

문제 공간에 고성능이 필요하지 않은 경우 (역학은 성능이 히트됩니다) 이는 훌륭한 솔루션입니다. 보기는 모델에 대해 아무것도 알 필요가 없지만보기 모델은 "있는 그대로"제공되는 속성을 프록시 할 필요는 없습니다. 언제든지 뷰 모델에 특성을 추가하여 뷰 또는 모델을 수정하지 않고 모델 속성을 랩핑 할 수 있습니다. 자세한 내용은 기사를 읽으십시오.

모든 모델에 대한 뷰 모델을 갖는 것이 그보다 나빠질 수 있습니다. 모델의 계층 구조 또는 간단한 컬렉션이 있으면 어떻게됩니까? 이 경우 모든 모델을 반복하고 모델 당 뷰 모델 인스턴스를 구축하고 알림 선택 이벤트 또는 기타 이벤트를 등록해야합니다. IMHO, 이것은 완전히 미쳤고 불합리합니다. Danice가 말했듯이, 당신은 많은 코드와 큰 두통으로 끝날 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top