1

我通过 Google 和 StackOverflow 进行了很多搜索,但没有任何答案可以解决我的问题。

我有两个 Xaml 文件:

主窗口.xaml

<Window x:Name="mainWindow">
    <Window.DataContext>
        <!-- Instantiate ViewModel of the MainWindow -->
        <vm:MainWindowViewModel x:Name="viewModel"/>
    </Window.DataContext>

    <!-- Create the Menu of the MainWindow -->
    <custom:MainMenu Grid.Row="0"/>

    <ad:DockingManager x:Name="dockingManager">
    <!-- ... -->
</Window>

MainMenu.xaml

<UserControl>
    <Menu>
        <MenuItem Header="{t:Translate MENU_LAYOUT_SAVE}" Command="{Binding SaveLayoutCommand}" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=Window}}"/>
        <MenuItem Header="{t:Translate MENU_LAYOUT_LOAD}" Command="{Binding LoadLayoutCommand}" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=Window}}"/>
    </Menu>
</UserControl>

我的问题出现在这里。而不是传递 Mainwindow 对象,我想x:Name="dockingManager"从 MainWindow 传递 DockingManager。但是,如果我尝试通过其名称引用该对象,它会失败......

我尝试了以下绑定:

CommandParameter="{Binding ElementName=dockingManager}"
CommandParameter="{Binding ElementName=dockingManager, RelativeSource={RelativeSource AncestorType=Window}}"

那么如何dockingManager从 xaml 中的 ElementTree 中找到并引用一个 Object ()。我想避免在代码隐藏中使用额外的代码。

4

3 回答 3

6

试试CommandParameter="{Binding ElementName=dockingManager, Path=.}"

编辑:以前的答案不起作用。这是一个可行的想法...

在 Window.xaml 中:

<custom:MainMenu Grid.Row="0" Tag="{Binding ElementName=dockingManager}" />

在 MainMenu.xaml 中:

<UserControl x:Name="UcMainMenu" />
...
    <MenuItem Header="{t:Translate MENU_LAYOUT_SAVE}" Command="{Binding SaveLayoutCommand}" CommandParameter="{Binding ElementName=UcMainMenu, Path=Tag}"/>
于 2013-09-27T13:51:18.543 回答
4

您可以使用:

CommandParameter="{x:Reference Name=yourElementName}"
于 2018-10-15T14:15:18.213 回答
0

由于您使用的是 MVVM,因此您应该这样做以提出稍微不同的解决方案:

  • 摆脱CommandParameter
  • 该命令将触发MainWindowViewModel实例中的回调
  • 此回调将更改MainWindowViewModel实例中的某些状态/属性
  • 实例通过绑定对实例DockingManager的调整状态做出反应MainWindowViewModel

你现在做的方式太复杂了。除此之外,你在这里疯狂地混合模式。MVVM 试图将业务逻辑与实际元素分开。您正在使用 MVVM 的元素和智能 UI/代码隐藏技术。

此外,请考虑将单独的视图模型用于单独的控件。主菜单控件是独立的,停靠管理器也是。为什么?因为您想将所有内容分解成更小的部分,但更重要的是,因为您可能会考虑可重用性。主菜单试图访问内部的停靠管理器Window是不可能的。

于 2013-09-27T13:51:35.437 回答