我使用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做出哪些更改?
答案 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)" />