WPF:设置UserControl DataContext

Bri*_*nKE 5 data-binding wpf datacontext button mvvm

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

有人可以解释如何将DataContext导航面板(LinksView.xaml)分配给LinksViewModel.cs.我想绑定的命令(BtnCompanyClickCommand)的按钮并定义BtnCompanyClickCommandLinksViewModel.cs.

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

MainWindow.xaml

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

</StackPanel>
Run Code Online (Sandbox Code Playgroud)

LinksView.xaml

<StackPanel Orientation="Vertical">
    <Button Content="Company" Width="75" Margin="3" Command="{Binding ElementName=Links,Path=BtnCompanyClickCommand}" />
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

编辑

所以我终于遇到了如何设置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>
Run Code Online (Sandbox Code Playgroud)

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

mar*_*man 0

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

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

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