TreeView上下文菜单MVVM绑定

5
我目前有一个使用MVVM模型的UserControl。
在该控件中,有一个TreeView用于显示一些项。我为这个TreeView添加了一个HierarchicalDataTemplate,并在该模板中添加了一个Items的ContextMenu。
ViewModel是该控件(名为RestoresTreeViewControl)的DataContext,在其中有一个命令,我想将其中一个菜单项绑定到该命令。但是我的做法似乎没有起作用。我收到了通常的无法找到绑定引用源的错误信息。
以下是我尝试将EditDatabaseCommand绑定到其中一个菜单项的datatemplate的代码片段。
<HierarchicalDataTemplate DataType="{x:Type model:Database}" >
                    <StackPanel>
                        <TextBlock Text="{Binding Name}" >
                            <TextBlock.ContextMenu>
                                <ContextMenu>
                                    <MenuItem Header="Edit" Command="{Binding ElementName=RestoresTreeViewControl, Path=DataContext.EditDatabaseCommand}" />
                                    <MenuItem Header="Delete"/>
                                    <Separator/>
                                    <MenuItem Header="Test Connection"/>
                                </ContextMenu>
                            </TextBlock.ContextMenu>
                        </TextBlock>
                    </StackPanel>
                </HierarchicalDataTemplate>

这里是ViewModel的一个区域,其中包含命令。

public ICommand EditDatabaseCommand { get; private set; }

这里也有同样的问题!对我来说,这似乎是个 bug,我已经试图调整上下文菜单很长时间了,但它就是不起作用... - lukebuehler
啊,我想我找到了,看看我的答案。 - lukebuehler
3个回答

6

很不幸,ContextMenu不在VisualTree中,所以它看不到你的DataContext。你可以像这样做(从这里复制:MVVM binding command to contextmenu item

<Button Height="40" Margin="0,2,0,0" CommandParameter="{Binding Name}" 
Tag="{Binding RelativeSource={RelativeSource Mode=FindAncestor, 
      AncestorType={x:Type UserControl}}}" Command = "{Binding 
      RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}},
      Path=DataContext.ConnectCommand}">
        <Button.ContextMenu>
            <ContextMenu>
                <MenuItem Header="Remove" 
               CommandParameter="{Binding Name}"
            Command="{Binding Path=PlacementTarget.Tag.DataContext.RemoveCommand,
            RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"/>
            </ContextMenu>
</Button.ContextMenu>

所以,只需使用PlacementTarget.Tag来查找您的ViewModel。

谢谢!这结束了我2小时的噩梦,我一直在尝试实现一个非常相似的结果 :) - Tomas Kohl

0
你可以尝试追踪绑定:
 xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase"
 ...
 {binding ... diag:PresentationTraceSources.TraceLevel="High"}

然而,要求控件的用户(即使只是你自己)为每个“RestoresTreeViewControl”实例命名是相当繁琐的。

尝试:

 {Binding Path=... RelativeSource={ FindAncestor, AncestorType={x:TheRestoresTreeViewControlType}} } 

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接