WPF:设置UserControl DataContext

时间:2013-01-02 05:27:03

标签: wpf button data-binding mvvm datacontext

我有以下MainWindow列出左侧导航面板和右侧显示区域(这两个都是UserControls)。

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

我尝试过在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如何设置UserControl的DataContext,它必须在UserControl的第一个子项上完成。

以下是修改后的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而不是UserControl,以及为什么用于LinksView的DataTemplate(在FormsDictionary.xaml中设置)不与LinksViewModel的DataContext绑定。任何解释都将不胜感激。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

MainWindowViewModel中应该有一个LinksViewModel实例:

MainWindowViewModel.cs:

class MainWindowViewModel
{
    public MainWindowViewModel()
    {
         LinksVM = new LinksViewModel();
    }

    public LinksViewModel LinksVM { get; private set; }
}

MainWindow.xaml

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

LinksView.xaml

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

由于LinksView是在MainWindow中显式创建的,因此在DataTemplate中不需要-可以将其删除

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