2013-01-02 111 views
5

我有以下MainWindow,其中列出了左侧导航面板和右侧显示区域(这两个都是UserControls)。WPF:设置UserControl DataContext

有人能解释如何分配导航面板(LinksView.xaml)到的LinksViewModel.csDataContext。我想将一个命令(BtnCompanyClickCommand)绑定到该按钮并在LinksViewModel.cs中定义BtnCompanyClickCommand

我已经尝试过在StackOVerflow上设置DataContext的各种方法,但这些解决方案似乎都不起作用(绑定RelativeSource,命名视图和绑定到名称等)。

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> 

编辑

所以我终于碰到这个explanation如何设置其必须在用户控件的第一个子项目做了用户控件的DataContext的来了。

这是修改后的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> 

不过,我仍然对我为什么要设置子元素的DataContext的,而不是用户控件以及为什么DataTemplate中的LinksView(在FormsDictionary.xaml设定)不扎入的DataContext不明确LinksViewModel。任何解释将不胜感激。

+0

如果您删除您在编辑中添加的DataContext片段,它仍然有效吗?我假设你将在这个场景中设置MainWindow视图的datacontext。 –

+0

如果我从我的编辑中删除 ...,那么LinksView有一个MainWindowViewModel的DataContext。 – BrianKE

+0

如果在LinksView上没有设置datacontext显式,WPF将遍历树寻找一个 - 在你的情况下,在MainWindow上的datacontext。 –

回答

0

首先你必须在你的XAML代码中引用你的DataContext(LinksViewModel.cs)。 您可以通过直接实例化或使用ResourceDictionary来实现。在后一种情况下,您可以在一些.cs文件或ResourceDictionary .xaml文件内实例化DataConext,并将其存储在一个指定的ResourceDictionary中,您可以在其中找到该引用。

其次,您只需将View元素的DataContext属性(如LinksView.xaml)与相应的DataContext相关联即可。

这是非常高级的,没有任何代码,但这是它背后的基本思想。

+0

谢谢,我明白我必须将DataContext连接到XAML,就像我说过的,我尝试了关于SO的其他问题上提出的各种解决方案。然而,我不能让这些与我的应用程序一起工作,所以我希望有人能够真正推荐一些我可以尝试的代码。我没有尝试在ResourceDictionary中设置LinksView的DataContext,但没有奏效。 – BrianKE