TreeView ContextMenu MVVM绑定

Mat*_*ill 5 wpf treeview binding contextmenu mvvm

我目前有一个使用MVVM模型的UserControl。

在该控件中,有一个TreeView,其中显示了一些项目。我为此TreeView添加了一个HierarchicalDataTemplate,并且在该模板中是Items的ContextMenu。

在ViewModel中,它是控件的DataContext(名为RestoresTreeViewControl),它是我要将菜单项之一绑定到的命令。但是,我所做的似乎不起作用。我得到通常找不到绑定参考的源。

这是试图将EditDatabaseCommand绑定到菜单项之一的数据模板的代码。

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

这是命令所在的ViewModel的一部分。

public ICommand EditDatabaseCommand { get; private set; }
Run Code Online (Sandbox Code Playgroud)

小智 6

不幸的是,文本菜单不在的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>
Run Code Online (Sandbox Code Playgroud)

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


jyo*_*ung 0

您可以尝试跟踪绑定:

 xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase"
 ...
 {binding ... diag:PresentationTraceSources.TraceLevel="High"}
Run Code Online (Sandbox Code Playgroud)

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

尝试:

 {Binding Path=... RelativeSource={ FindAncestor, AncestorType={x:TheRestoresTreeViewControlType}} } 
Run Code Online (Sandbox Code Playgroud)