Caliburn微动作内部ItemContainerStyle - 没有发现任何目标的方法

Caliburn微动作内部ItemContainerStyle - 没有发现任何目标的方法

问题描述:

我正在使用Caliburn Micro作为MVVM框架的WPF项目,并在上周我很幸运地找到任何问题的每个解决方案*,但现在我面临着一个我自己无法解决的更大问题。Caliburn微动作内部ItemContainerStyle - 没有发现任何目标的方法

我有一个包含TreeView的视图;树视图的每个项目应该调用方法时:

  • 它被双击[工作]
  • 单击[行不通]

这是TreeView的上下文菜单的条目:

<TreeView x:Name="projectTreeView" 
       Visibility="{Binding ExplorerVisibility, Converter={StaticResource visibilityConverter}}"> 
     <TreeViewItem Header="{Binding ProjectName}" IsExpanded="True"> 
      <TreeViewItem Header="Category 1"/> 
      <TreeViewItem Header="Category 2" ItemsSource="{Binding Images}"> 
       <TreeViewItem.ItemContainerStyle> 
        <Style TargetType="TreeViewItem"> 
         <Setter Property="ContextMenu"> 
          <Setter.Value> 
           <ContextMenu> 
            <MenuItem Header="Remove" 
               cal:Action.TargetWithoutContext="{Binding Path=DataContext, ElementName=projectTreeView}" 
               cal:Message.Attach="[Event Click] = [Action RemoveResource()]"/> 
           </ContextMenu> 
          </Setter.Value> 
         </Setter> 
        </Style> 
       </TreeViewItem.ItemContainerStyle> 
       <TreeViewItem.ItemTemplate> 
        <HierarchicalDataTemplate> 
         <HierarchicalDataTemplate.ItemContainerStyle> 
          <Style TargetType="TreeViewItem"> 
           <Setter Property="IsExpanded" Value="True" /> 
           <Style.Triggers> 
            <EventTrigger RoutedEvent="Collapsed"> 
             <EventTrigger.Actions> 
              <BeginStoryboard> 
               <Storyboard> 
                <BooleanAnimationUsingKeyFrames 
            Duration="0" 
            Storyboard.TargetProperty="(TreeViewItem.IsExpanded)"> 
                 <DiscreteBooleanKeyFrame KeyTime="0" Value="True" /> 
                </BooleanAnimationUsingKeyFrames> 
               </Storyboard> 
              </BeginStoryboard> 
             </EventTrigger.Actions> 
            </EventTrigger> 
           </Style.Triggers> 
          </Style> 
         </HierarchicalDataTemplate.ItemContainerStyle> 
         <ContentControl cal:Action.TargetWithoutContext="{Binding Path=DataContext, ElementName=projectTreeView}" 
             cal:Message.Attach="[Event MouseDoubleClick] = [Action OpenResource(projectTreeView.SelectedItem)]"> 
          <StackPanel Orientation="Horizontal"> 
           <TextBlock Text="{Binding ResourceName}" Margin="5,0,0,0"/> 
          </StackPanel> 
         </ContentControl> 

         <HierarchicalDataTemplate.ItemTemplate> 
          <DataTemplate> 
           <TextBlock Text="{Binding}"/> 
          </DataTemplate> 
         </HierarchicalDataTemplate.ItemTemplate> 

        </HierarchicalDataTemplate> 
       </TreeViewItem.ItemTemplate> 
      </TreeViewItem> 
     </TreeViewItem> 
    </TreeView> 

所附视图模型包含这两种方法:

public class MyViewModel 
{ 
    ... 

    public void OpenResource(object obj) { ... } 

    public void RemoveResource() { ... } 

} 

出于某种原因OpenResource不同之处完美的作品,而当我点击右键菜单项(右键点击后)的应用程序崩溃:

An unhandled exception of type 'System.Exception' occurred in WindowsBase.dll 

Additional information: No target found for method RemoveResource. 

我发现了一些相关的同样的问题在这里论坛和支持论坛上,但我无法用这些技巧解决问题。

你对我的TreeView中发生了什么有什么想法吗?

非常感谢您的帮助!

+0

是RemoveResource()应该有一个对象obj参数? – gabba

+0

http://caliburnmicro.codeplex.com/discussions/287228检查这是否适合你(EisenbergEffect的最后一篇文章)。 – ShadeOfGrey

ContextMenu驻留在其自己的可视化树中,不能使用ElementName绑定到TreeView

你可以尝试将TreeViewItemTag属性绑定到父TreeView,然后使用ContextMenuPlacementTarget属性绑定到它:

<Style TargetType="TreeViewItem"> 
    <Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource AncestorType=TreeView}}" /> 
    <Setter Property="ContextMenu"> 
     <Setter.Value> 
      <ContextMenu> 
       <MenuItem Header="Remove" 
            cal:Action.TargetWithoutContext="{Binding Path=PlacementTarget.Tag.DataContext, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}" 
            cal:Message.Attach="[Event Click] = [Action RemoveResource()]"/> 
      </ContextMenu> 
     </Setter.Value> 
    </Setter> 
</Style> 
+0

非常感谢你,你很棒!它的工作原理,我不得不编辑TargetWithoutContext一点点: CAL:Action.TargetWithoutContext = “{绑定路径= PlacementTarget.Tag.DataContext,的RelativeSource = {的RelativeSource模式= FindAncestor,AncestorType =文本菜单}}” 莫非你请更新答案以供将来参考? 现在我有最后一个问题:我如何将绑定到TreeViewItem的对象传递给RemoveResource?再次感谢!!! – Brutus

+0

我已经更新了答案。如果您有新问题,请提出一个新问题。在评论中回答有点麻烦。 – mm8

+1

我自己找到了,就像使用[Action RemoveResource($ datacontext)]一样简单。 非常感谢你,我真的不知道如何解决! :) – Brutus