2011-04-27 4 views
21

제목이 혼란 스럽긴하지만 죄송합니다. 내 질문을 단축하는 방법을 모르겠습니다. 어쨌든, 여기 있습니다.MVVM - VM에서 노출 된 Model 객체에 직접 바인딩하거나 Model 속성에 액세스하기 위해 VM에서 별도의 속성을 구현합니다.

WPF, Entity Framework 및 MVVM을 사용하고 있습니다.

현재 내 뷰 모델에, 나는 그런 속성

public Model.Document Document {get;set;} //Model.Document is an EF Entity 

을 가지고, XAML에서, 나는

<TextBox Text={Binding Path=Document.Title}/> 

제목에 결합은 물론 모델의 속성입니다. 질문 다음 지금

내 마음에 온 : 난 그렇게

public string Title 
    { 
     get { return Document.Title; } 
     set { Document.Title = value; } 
    } 

처럼 뷰 모델에 속성을 추가하고 다음과 같이 결합하면 가 더 나은되지 않을 것보기에서 모델을 분리하려면

<TextBox Text={Binding Path=Title}/> 

어떤 방법을 사용 하시겠습니까?

답변

11

How Data Binding References are Resolved을 살펴보면 바인딩하려는 속성을 노출하는 방법을 결정할 때 고려해야 할 성능 문제가 있음을 알 수 있습니다.

Model.Document가 INotifyPropertyChanged 인터페이스를 구현합니까? 그렇지 않은 경우에는보기 모델에 Title 속성을 추가하고 제목을 변경하면보기를 알리기 위해 PropertyChanged 이벤트가 발생하도록보기 모델에서 INotifyPropertyChanged를 구현하는 것이 좋습니다.

또 다른 방법은 뷰 모델의 제목을 DependencyProperty으로 표시하는 것입니다. 바인딩 및 렌더링 시간이 빨라집니다.

+0

꽤 재미있는 기사 (데이터 바인딩 참조가 어떻게 해석되는지)입니다. –

+0

정말 재미있는 기사입니다. Document가 상속하는 [ 'EntityObject'] (http://msdn.microsoft.com/en-us/library/system.data.objects.dataclasses.entityobject.aspx)는 'INotifyPropertyChanged'를 구현하므로주의를 기울여야합니다. 의. 그러나, 내 ViewModel INotifyPropertyChanged도 구현합니다. 따라서 어떤 방식 으로든 상관 없습니다. –

+0

DependencyProperty로 속성을 구현하는 것은 내 ViewModel이 DependencyObject에서 상속하지 않기 때문에 옵션이 아닙니다. (필자가 믿는 요구 사항입니까?). 오히려 MVVM Light 프레임 워크의 ViewModelBase 클래스에서 상속됩니다. –

2

적어도 IMO를 사용하는 것이 더 좋은 방법입니다. 나는 다른 방법으로 실제로는 보지 못했다. 뷰 모델은 뷰와 모델 사이의 중개자 역할을하므로 두 모델은 서로에 대한 지식이 없어야합니다.

여기에 간단한 example이 있습니다.

2

정말 상황에 따라 다릅니다. 진정한 의미에서보기는보기 모델과 만 상호 작용해야합니다. 그러나 위의 두 가지 방법 모두 장점이 있습니다.

Document 속성을 노출하면 액세스해야하는 모든 속성을 복제 할 필요가 없습니다. 따라서 많은 속성이 있거나 일종의 리플렉션 (예 : PropertyGrid에 문서 표시)을 사용하는 경우이 방법이 더 좋습니다.

후자의 접근 방식을 사용하면보기에 표시된 값을보다 효과적으로 제어 할 수 있습니다. 따라서 모델이나 다른 여러 가지 작업에 커밋되기 전에 제목을 변경 (즉, 여분의 공백 제거) 할 수 있습니다. 뷰를 인식하지 않고도 문서에서 바꿀 수 있습니다 (심지어 돌보는 것조차도).

1

값이 변경되지 않는 모델 속성에 대한 읽기 전용 바인딩에는 아무런 문제가 없습니다.

두 가지 중요한 요소가 있습니다.모델 속성에 대한 읽기/쓰기 바인딩은 문제가 너무 복잡하여 상황을 현명하게 분석하지 않고 상황을 분석하지 않고 뷰 모델에 속성을 구현하고 완료 할 수 있는지 확인합니다. 그것으로. 그리고 내 모델이 변경 알림을 지원하지 않는다면 필자가 필요로 할 경우 뷰 모델에서 구현해야 할 것입니다.

+1

r/w 속성에 바인딩하면 잠재적 인 문제가 발생한다는 것은 무엇을 의미합니까? 몇 가지 예가 있습니까? –

1

당신은 WPF Application Framework (WAF)BookLibrary 샘플 응용 프로그램을 살펴해야 할 수도 있습니다. 그것은 첫 번째 접근법을 사용하고 MVVM 패턴 (관심의 분리, 단위 테스트 가능)을 따른다.

Binding이 INotifyPropertyChanged 엔티티 구현을 사용하기 때문에 ViewModels가 단순 해집니다. 그렇지 않은 경우, ViewModel간에 수동으로 변경 내용을 동기화해야합니다.

관련 문제