ItemContainerStyle 中的 Caliburn Micro Action - 未找到方法的目标

Caliburn Micro Action inside ItemContainerStyle - No target found for method

我正在开发一个使用 Caliburn Micro 作为 MVVM 框架的 WPF 项目,上周我很幸运地在 Whosebug 上找到了任何问题的所有解决方案,但现在我面临我自己无法解决的更大问题。

我有一个包含 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>

附加的 ViewModel 包含两种方法:

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 中发生了什么吗?

非常感谢您的帮助!

ContextMenu 位于其自己的可视化树中,无法使用 ElementName.

绑定到 TreeView

您可以尝试将 TreeViewItemTag 属性 绑定到父级 TreeView,然后使用 PlacementTarget [= ContextMenu 的 23=]:

<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>