我通过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
)。我想避免在代码隐藏中使用额外的代码。
答案 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
内无法实现的停靠管理器。