2013-04-03 31 views
3

我有我的分层树视图绑定奇妙我的ViewModel使用Caliburn微。 (ViewModel有一个Items属性返回一个ObservableCollection - treeview被命名为这个Items属性 - 绑定没有问题)。Caliburn Micro与Treeview上下文菜单

但是,问题出现在上下文菜单中。该菜单在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,以达到我想要什么?

回答

4

ContextMenus位于从一切独立的可视化树 - 它可以是一个痛苦,以获得正确的绑定(我经常有10-15分钟的战斗对他们的绑定,让他们正确的!)

你已经设置了你的Message.Attach附属属性,你所需要做的就是确保动作目标指向虚拟机而不是数据项。您可以使用Action.TargetWithoutContext指定目标的行动(CM会以其他方式使用DataContext

您还需要获得一个指向其他视觉树绑定路径 - 尝试使用RelativeSource绑定 - 将ContextMenu也有一个叫做财产PlacementTarget其应指向的ContextMenu附接到

所以可能的元件:

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

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

您可能需要试验,因为我经常第一次得到这个差不多!由OP(肖恩)

编辑: 这就是我最终的工作:

<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)" />