从 ElementTree 的根传递 Element 作为 CommandParameter

Mar*_*hal 1 c# data-binding wpf xaml mvvm

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

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

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

我尝试了以下绑定:

CommandParameter="{Binding ElementName=dockingManager}"
CommandParameter="{Binding ElementName=dockingManager, RelativeSource={RelativeSource AncestorType=Window}}"
Run Code Online (Sandbox Code Playgroud)

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

Paw*_*tyl 6

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

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

在 Window.xaml 中:

<custom:MainMenu Grid.Row="0" Tag="{Binding ElementName=dockingManager}" />
Run Code Online (Sandbox Code Playgroud)

在 MainMenu.xaml 中:

<UserControl x:Name="UcMainMenu" />
...
    <MenuItem Header="{t:Translate MENU_LAYOUT_SAVE}" Command="{Binding SaveLayoutCommand}" CommandParameter="{Binding ElementName=UcMainMenu, Path=Tag}"/>
Run Code Online (Sandbox Code Playgroud)


Dav*_*zzo 5

您可以使用:

CommandParameter="{x:Reference Name=yourElementName}"
Run Code Online (Sandbox Code Playgroud)