2011-03-31 4 views
4

뷰의 datacontext를 viewmodel에 설정하는 여러 가지 방법을 생각하려고합니다. 나는이 순간에 oggling있어Resource의 DataTemplate은 ViewModel을 View로 설정하지만 그 다음은

하나는 이런 식입니다 :

내 MainWindowResource 있습니다

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:vw="clr-namespace:DemoStuffPartII.View" 
       xmlns:vm="clr-namespace:DemoStuffPartII.ViewModel"> 

<DataTemplate DataType="{x:Type vm:PersonViewModel}"> 
    <vw:PersonView /> 
</DataTemplate> 

을하지만 좌초 곳이 바로도이다. 보기에서 ContentControl을 사용해야한다는 것을 알고 있습니다. 그러나 그것을 구성하는 가장 좋은 방법은 무엇입니까? 이 일에 어떻게 가야합니까?

답변

2

이렇게하면 MVVM 응용 프로그램에서 ViewSwitching 탐색을 활성화 할 수 있습니다.

다른 누락 비트

은 : 보기로 - 뷰 모델에서>

<ContentControl Content="{Binding CurrentPage}" /> 

- 그러나> (의사 코드)

Prop ViewModelBase CurrentPage. 

참고 U 원하는 모두는 연결이면 ViewModel을 View로 드래그하면 전체 DataTemplate-ContentControl을 삭제할 수 있으며 this.DataContext = new SomeViewModel(); 코드 숨김에서

VM을 Views에 연결하는 가장 확실한 방법은 ViewModelLocator 패턴을 사용하는 것입니다. Google ViewModelLocator.

+0

Content = "{Binding CurrentPage}"라고하면, CurrentPage는 현재의 경우 PersonViewModel입니다. 비록 데이터 템플릿에 이미 지정되어있는 경우 ViewModel의 이름을 다시 지정해야할까요? 왜 안가 Content = "{Binding}"? –

+0

DataTemplate에 지정된 값이 "catching"입니다. 이것은 "목표"입니다. Binding에서 지정하는 것은 "소스"입니다. 그러나 나는 처음부터 시작하는 대신에 여기에서 2 단계를보고 있다고 느낍니다. MVVM을 사용하기 위해서는 처음에는 간단하게 유지해야합니다. this.DataContext = new SomeViewModel(); –

+0

그래, 아마도 잘못된 순서로 몇 가지 일을하는 경우가 있는데, 때로는 어디에서 시작하는지 모호합니다. anser와 ViewModelLocator 패턴의 팁을 가져 주셔서 감사합니다! –

0

어쩌면이 질문에 직접 대답하지 않을 수도 있지만 MVVM 프레임 워크를 사용하여 보셨나요?

public class ShellViewModel : Conductor<IScreen> 
{ 
    public ShellViewModel() 
    { 
    var myViewModel = new MyViewModel(); 
    this.ActivateItem(myViewModel); 
    } 
} 

ShellView.xaml

<Grid> 
    <ContentControl x:Name="ActiveItem" /> 
</Grid> 

MyView.xaml

<Grid> 
    <TextBlock>Hello world</TextBlock> 
</Grid> 

이것은 뷰 모델 첫 번째 방법입니다 : 예를 들어, Caliburn.Micro에 당신은 (아주 기본적인 예) 할 것이다.

+0

네, MVVM과 관련하여 여러 가지 방법을 찾아야합니다. 내 작품에서 프리즘을 사용합니다. 프리즘은 제가 틀리지 않으면 프리 프레임 워크와 같은 맥락에서 사용합니다. –

+0

충분합니다. 예를 들어, 이벤트 수집기는 POCO 객체를 사용하는 것이 훨씬 쉬우 며 POCO 객체와 함께 작동하며 컨벤션 기반 바인딩을 지원하고 매우 강력한 액션 모델을 가지고 있습니다. – devdigital

1

ViewModel을 뷰에 바인딩하는 몇 가지 간단한 방법이 있습니다.

_vm = new MarketIndexVM(); 
this.DataContext = _vm; 

또는, 당신이보기 당신의 XAML에서 리소스로 뷰 모델을 지정할 수 있습니다 : Elad 언급했듯이 당신은 코드 숨김에 추가 할 수 있습니다

<UserControl.Resources> 
    <local:CashFlowViewModel x:Key="ViewModel"/> 
    <Converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/> 
</UserControl.Resources> 

과의 DataContext에 바인딩하여 해당 리소스에 대한 LayoutRoot :

<Grid x:Name="LayoutRoot" DataContext="{StaticResource ViewModel}"> 
+0

+1 그건 순진한 방법이지만 처음에는 갈 길이 멀다. –

+0

'는 어떻습니까? –

관련 문제