2013-01-02 1 views
5

왼쪽 탐색 패널과 오른쪽 표시 영역 (둘 다 UserControls)을 배치하는 다음 MainWindow이 있습니다.WPF : UserControl DataContext 설정

내비게이션 패널 DataContext (LinksView.xaml)을 LinksViewModel.cs에 할당하는 방법을 설명 할 수 있습니까? 명령 (BtnCompanyClickCommand)을 단추에 바인드하고 BtnCompanyClickCommandLinksViewModel.cs에 정의하고 싶습니다.

DataContext를 설정하기 위해 StackOverflow에서 찾은 다양한 방법을 시도했지만 이러한 솔루션 중 아무 것도 작동하지 않는 것 (바인딩 관계형 소스, 이름 지정 및 이름 바인딩 등).

MainWindow.xaml

<StackPanel Orientation="Horizontal"> 
    <vw:LinksView DataContext="{Binding RelativeSource={RelativeSource Self}}"/> 
    <ContentControl Content="{Binding CurrentUserControl}" /> 

</StackPanel> 

LinksView.xaml

<StackPanel Orientation="Vertical"> 
    <Button Content="Company" Width="75" Margin="3" Command="{Binding ElementName=Links,Path=BtnCompanyClickCommand}" /> 
</StackPanel> 

FormsDictionary.xaml

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

    <DataTemplate DataType="{x:Type vm:CompanySummaryViewModel}"> 
     <vw:CompanySummaryView> 
      <ContentControl Content="{Binding }" /> 
     </vw:CompanySummaryView> 
    </DataTemplate> 

    <DataTemplate DataType="{x:Type vm:LinksViewModel}"> 
     <vw:LinksView /> 
    </DataTemplate> 

</ResourceDictionary> 

편집 그래서 나는 마지막으로 UserControl을의 첫 번째 자식 항목을 수행 할 수있는 UserControl을의 DataContext를 설정하는 방법이 explanation을 가로 질러왔다.

다음은 수정 된 LinksView.xaml입니다.

<StackPanel Orientation="Vertical"> 
    <StackPanel.DataContext> 
     <vm:LinksViewModel /> <!-- Bind the items in StackPanel to LinksViewModel --> 
    </StackPanel.DataContext> 

    <Button Content="Company" Width="75" Margin="3" Command="{Binding BtnCompanyClickCommand}" /> 
</StackPanel> 

그러나, 나는 아직도 내가 (FormsDictionary.xaml에서 설정) LinksView에 대한 DataTemplate을이의 DataContext에 넥타이를하지 않는 이유는 자식 요소의 DataContext에 아닌 UserControl을하고 설정해야하는 이유에 명확하지 않다 LinksViewModel의 모든 설명을 주시면 감사하겠습니다.

+0

편집에서 추가 한 DataContext 조각을 제거해도 여전히 작동합니까? 이 시나리오에서는 MainWindow 뷰의 datacontext를 설정한다고 가정합니다. –

+0

내 편집에서 ...를 제거하면 LinksView에 MainWindowViewModel의 DataContext가 있습니다. – BrianKE

+0

LinksView에 datacontext 명시가 설정되어 있지 않으면 WPF는 TreeWindow에서 MainWindow의 datacontext를 찾는다. –

답변

0

먼저 XAML 코드에서 DataContext (LinksViewModel.cs)를 참조해야합니다. 직접 인스턴스화하거나 ResourceDictionary를 사용하여이를 수행 할 수 있습니다. 후자의 경우 DataConext를 일부 .cs 파일 또는 ResourceDictionary .xaml 파일 내부에서 인스턴스화하고 나중에 참조를 찾을 수있는 명명 된 ResourceDictionary에 저장합니다.

두 번째로, LinksView.xaml과 같은 View 요소의 DataContext 속성을 해당 DataContext와 연결하기 만하면됩니다.

이것은 꽤 높은 수준이며 코드가 없지만 그 기본 아이디어입니다.

+0

고마워, 나는 DataContext를 XAML에 연결해야한다는 것을 이해한다. 그래서 나는 다른 질문에 대해 제안 된 다양한 솔루션을 시도했다. 그러나, 나는 누군가가 실제로 시도 할 수있는 몇 가지 코드를 제안 할 수 있기를 희망하면서이 코드를 내 응용 프로그램과 함께 사용할 수 없습니다.내가 ResourceDictionary에서 LinksView의 DataContext를 설정하려고했지만 그게 작동하지 않았다. – BrianKE