2011-03-14 4 views
2

나는 (이 mvvm 물건에 여전히 약간 녹색) 단순한 무언가를 놓치고 있다고 확신하지만, ViewModelLocator를 사용하면 viewModel에 대한 DataTemplate 바인딩 뷰의 필요성이 제거되었다고 생각했습니다. 하지만 웬일인지 나는 아직도 그것을 필요로하는 것처럼 보입니다.ViewModelLocator가 DataTemplate의 neccessity를 제거해야합니까?

WPF 응용 프로그램에는 기본 바인딩에 바인딩되는 내용 템플릿 만있는 내용의 창이 있습니다.

<Window ... DataContext="{Binding MainView, Source={StaticResource Locator}}"> 
<grid><ContentControl Content="{Binding}"/></grid> 

나는 실제적인 view-viewmodel이라고 말할 수있는 UserControl을 가지고 있습니다. 내가 발견 한 무엇

<UserControl ... 
DataContext="{Binding MainView, Source={StaticResource Locator}}"> 
...xaml... 
</UserControl> 

내가 DataTemplate을 배치하지 않는 한보기를 결합하는 것입니다 - App.xaml에 (이 경우 MAINVIEW) 뷰 모델을, 난 그냥 클래스의 이름을 얻는다.

윈도우의 datacontext가 로케이터를 사용하여 바인딩 되었기 때문에이 방법이 효과가 있다고 생각했습니다. 내 생각 엔 ContentControl을 사용하는 윈도우의 추가 레이어가 혼란 스럽다는 것입니다.

ContentControl을 뷰에 대한 직접 참조로 바꾼 경우, 즉.

<view:MainView /> 

이것은 또한 작동합니다. 그래서 나는 두 가지 질문을 가지고 있다고 생각합니다 : 1. 바인딩이 이것을 이해하지 못하는 이유는 무엇입니까? 2. 로케이터를 사용하여이를 작동시키는 방법이 있습니까? 최소한의 ui로 창을 만들고 UserControls에 일괄 처리를 유지하고 싶습니다.

감사합니다. 그냥 DataTemplate을하지 않고 클래스를 할당하는 경우

가려진

답변

1

각 콘텐츠 컨트롤이 문자열로 변환 디폴트로, 모든 개체를 보유 할 수 있습니다. DataTemplate은 바인딩 (객체의 propeties를 가져와 평가해야 함)을 포함하여 내용을 시각화하는 방법을 설명합니다.

ViewModelLocator는 DataTemplates에 아무 것도 없습니다. 이름이나 원하는대로 오른쪽 뷰 모델을 찾습니다. 뷰 모델을 생성/위치 지정하는 논리를 분리하여 한 곳에 모으는 방법입니다.

+0

DataContext 바인딩 선을 window.xaml에서 건너 뛰고 ContentControl에 표시 방법을 알려주는 App.xaml의 DataTemplate을 사용할 수 있습니다. 하지만 여전히 Usercontrol (mainview)에 대한 DataContext 바인딩이 필요합니다. 그래서 이것은 내가 contentControl을 usercontrol (mainview)에 배치하고 다른 view-viewmodel (customerview.xaml)을 지정하면이 뷰를 바인드하기 위해 또 다른 DataTemplate이 필요하다는 것을 의미합니다. – Obscured

+0

그렇습니다. 사용자 정의 컨트롤의 DataContext를 설정 했으므로 하나의 페이지에 여러 개의 사용자 정의 컨트롤을 가질 수 있습니다. 각 뷰에는 고유 한 ViewModel이 있고 물론 자신의 DataTemplate – Robert

+0

도 있습니다. 예제에서 사용할 수있는 것은 {바인딩}입니다. 부모 컨트롤 바인딩 잡아. 그러나 나는 보통 자신의 VM에 대한 usercontrols의 datacontext를 설정했고, 이는 자신의 XAML에있을 것입니다. – ecathell

관련 문제