带有Treeview上下文菜单的Caliburn Micro

时间:2013-04-03 11:23:19

标签: wpf caliburn.micro

我使用Caliburn Micro将我的分层树视图绑定到我的ViewModel。 (ViewModel有一个Items属性,它返回一个ObservableCollection - 树视图被命名为这个Items属性 - 绑定没有错误。)

然而,问题出现在上下文菜单中。该菜单在treenode表示的对象实例上触发方法。我想要实现的是让菜单在我的根ViewModel上触发一个方法,并将其作为参数传递给被点击的treenode所代表的对象的实例。 这是我的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 个答案:

答案 0 :(得分:4)

ContextMenus位于与其他所有内容分离的视觉树中 - 将绑定设置为正确可能会很麻烦(我经常需要10-15分钟来对抗绑定才能使它们正确!)< / p>

您已经设置了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}"

你可能需要进行实验,因为我第一次经常得到这个几乎

OP编辑(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)" />