从ElementTree的根传递元素作为CommandParameter

时间:2013-09-27 13:42:22

标签: c# wpf xaml data-binding mvvm

我通过Google和StackOverflow进行了大量搜索,但没有回答我的问题。

我有两个Xaml文件:

MainWindow.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传递DockingManager x:Name="dockingManager",而不是传递Mainwindow对象。但是,如果我尝试通过其名称引用该对象,它将失败...

我尝试了以下绑定:

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

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

3 个答案:

答案 0 :(得分:3)

尝试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}"/>

答案 1 :(得分:0)

您可以使用:

CommandParameter="{x:Reference Name=yourElementName}"

答案 2 :(得分:-1)

由于您正在使用MVVM,因此您应该采取一些稍微不同的解决方案:

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

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

另外,请考虑为各个控件使用单独的视图模型。主菜单控件是独立的,对接管理器也是。为什么?因为您希望将所有内容分解为更小的部分,但更重要的是,因为您可能会考虑到可重用性。主菜单尝试访问Window内无法实现的停靠管理器。