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

时间:2017-02-20 15:36:11

标签: c# wpf mvvm treeview caliburn.micro

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

我有一个包含TreeView的视图;树视图的每个项目都应在以下时间调用方法:

  • 双击[working]
  • 点击其上下文菜单的条目[not working]

这是TreeView:

makemigrations

附加的ViewModel包含两种方法:

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

出于某种原因 OpenResource 工作正常,而当我点击上下文菜单项(右键单击后)时,应用程序崩溃并出现异常:

public class MyViewModel
{
    ...

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

    public void RemoveResource() { ... }

}

我在论坛和支持论坛上发现了与此问题相关的内容,但我无法通过这些提示解决问题。

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

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

ContextMenu位于自己的可视树中,无法使用TreeView绑定到ElementName

您可以尝试将Tag的{​​{1}}属性绑定到父TreeViewItem,然后使用TreeView的{​​{1}}属性绑定到它:

PlacementTarget