2014-12-20 4 views
0

MVV 패턴을 사용하여 내 WPF 응용 프로그램에서 탐색을 구현하고 싶습니다. 다음 ViewModels 존재 :WPF datatemplates 및 viewModel의 자동 생성 객체

  • MainViewModel을 : 리본을
  • ConsignorViewModel 함유 애플리케이션 내 "프레임"가진 "아이"보기는 "프레임"
  • RecipientViewModel 안에 표시 할 :

    : 또 다른 "아이"보기 ...

내가 그렇게 App.xaml에 선언 DataTemplates를 사용, WPF는 "프레임"에 표시되어야하는보기를 결정하게하려면

<Application x:Class="MyProject.App" 
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:viewModels="clr-namespace:MyProject.ViewModels" 
       xmlns:views="clr-namespace:MyProject" 
       StartupUri="MainWindow.xaml"> 
    <Application.Resources> 
     <BooleanToVisibilityConverter x:Key="BoolToVis"/> 
     <DataTemplate DataType="{x:Type viewModels:ConsignorViewModel}"> 
      <views:ConsignorUC /> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type viewModels:RecipientViewModel}"> 
      <views:RecipientUC /> 
     </DataTemplate> 
    </Application.Resources> 
</Application> 

내 MainViewModel에는 ViewModel (내 기본 클래스) 유형의 "CurrentViewModel"속성이 있습니다. ConsignorViewModel과 RecipientViewModel은 ViewModel입니다.

ConsignorViewModel보기는 "사용자 정의"입니다 (창과 리본이 작동하지 않음).

<UserControl x:Class="MyProject.ConsignorUC" 
      ...> 
    <UserControl.DataContext> 
     <local:ConsignorViewModel /> 
    </UserControl.DataContext> 
    <Grid> 
     ... 
       <TextBox Name="searchterm" Margin="10,10,1,1" TextWrapping="Wrap" Text="{Binding SearchTerm, UpdateSourceTrigger=PropertyChanged}" Grid.Column="1" /> 
       ... 
     </Grid> 
    </Grid> 
</UserControl> 

자식보기에서 양방향 데이터 바인딩이 작동하지 않습니다. 내가 뭐 놓친 거 없니? ConsignorViewModel이 usercontrol에 바인딩되어야한다고 말하는 것은 잘못입니까?

업데이트 나는 솔루션을 문제를 발견,하지만했습니다 응용 프로그램을 시작할 때, 새로운 MainViewModel 개체가 만들어집니다. 그럼 내가 말하노니

currentViewModel = new ConsignorViewModel(); 

이제 내 자식보기는 ConsignorUC입니다. 새로운 ConsignorUC가 생성되면, ConsignorViewModel의 새로운 객체가 생성됩니다. 그래서 ConsignorViewModel의 다른 객체들을 가지고 있어야하지만, 하나만 가져야합니다.

+0

왜 제목을 변경 했습니까? 귀하의 질문에 여러 스레드에 대해서는 아무것도 없으므로 제목이 약간 혼란 스럽습니다. – dymanoid

+0

죄송합니다. 다른 "스레드"가 있다고 생각합니다. 그럴 것 같지 않습니다. 새로운 제목이 더 나은 것이기를 바랍니다. – mosquito87

답변

3

귀하의 문제는 실제로 여기에 있습니다 :

<UserControl.DataContext> 
    <local:ConsignorViewModel /> 
</UserControl.DataContext> 

명시 적으로 새로운 뷰 모델을 만들고 해당 뷰 생성에 뷰의 DataContext 속성에 할당합니다.

그냥이 방법

<UserControl 
    x:Class="MyProject.ConsignorUC" 
    DataContext = "{Binding DataContext.CurrentViewModel, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}"/> 

처럼 뭔가이 교체, 당신은 당신의 윈도우의 뷰 모델의 CurrentViewModel 속성 값에 아이 뷰의 DataContext을 설정합니다.

+0

고마워요. 그것이 해결책입니다. 그 가능성에 대해 몰랐고 XAML을 더 깊이 파고 들어야했습니다. – mosquito87