Caliburn Micro带有树形菜单上下文菜单

3
我使用Caliburn Micro很好地将我的分层树形视图绑定到了ViewModel上。(ViewModel具有返回ObservableCollection的Items属性,树形视图被命名为此Items属性-绑定没有问题)。
然而,问题出在上下文菜单中。菜单会在树节点表示的对象实例上触发一个方法。我希望实现的是,菜单在我的根ViewModel上触发一个方法,并将被点击的树节点所表示的对象实例作为参数传递给它。
以下是我的XAML代码:
<HierarchicalDataTemplate DataType="{x:Type m:TaskGrouping}" 
                                      ItemsSource="{Binding Children}">
                    <Label Content="{Binding Name}"
                           FontWeight="Bold">
                        <Label.ContextMenu>
                            <ContextMenu>
                                <MenuItem Header="Add New SubFolder"
                                          cal:Message.Attach="AddNewSubfolder" />
                                <MenuItem Header="Remove this folder"
                                          cal:Message.Attach="RemoveFolder" />
                            </ContextMenu>
                        </Label.ContextMenu>
                    </Label>
                </HierarchicalDataTemplate>

我需要对 XAML 进行哪些更改才能达到我的目的?
1个回答

4

ContextMenus位于一个独立的可视树中,与其他内容分开 - 要正确绑定它们可能会很麻烦(我经常需要花费10-15分钟来调整绑定!)

您已经设置了Message.Attach附加属性,您只需要确保操作目标指向VM而不是数据项。 您可以使用Action.TargetWithoutContext为操作指定目标(否则CM将使用DataContext

您还需要获取指向另一个可视树的绑定路径 - 尝试使用RelativeSource绑定 - ContextMenu还具有名为PlacementTarget的属性,该属性应指向附加ContextMenu的元素

因此,可能如下:

cal:Action.TargetWithoutContext="{Binding DataContext, RelativeSource={RelativeSource AncestorType=Label}}"

或者
cal:Action.TargetWithoutContext="{Binding PlacementTarget.DataContext}"

你可能需要尝试一下,因为我经常第一次就 几乎 做对了!

编辑者Shawn的修改:

<Label Content="{Binding Name}"
                               Tag="{Binding DataContext, ElementName=LayoutRoot}">
                            <Label.ContextMenu>
                                <ContextMenu
                                    cal:Action.TargetWithoutContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
                                    <MenuItem Header="Run Task Now" cal:Message.Attach="SomeRootViewModelMethod($dataContext)" />

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