5

我有以下MainWindow布局左侧导航面板和右侧显示区域(两者都是UserControls)。

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

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

主窗口.xaml

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

</StackPanel>

链接视图.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 的 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 绑定。任何解释将不胜感激。

4

2 回答 2

0

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

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

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

于 2013-01-02T05:37:58.440 回答
0

MainWindowViewModel 中应该有一个 LinksViewModel 的实例:

MainWindowViewModel.cs:

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

    public LinksViewModel LinksVM { get; private set; }
}

主窗口.xaml

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

链接视图.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>
于 2020-04-08T10:01:00.383 回答