【问题标题】:Caliburn Micro Action inside ItemContainerStyle - No target found for methodItemContainerStyle 内的 Caliburn Micro Action - 找不到方法的目标
【发布时间】:2017-02-20 15:36:11
【问题描述】:

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

我有一个包含 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 中发生了什么吗?

非常感谢您的帮助!

【问题讨论】:

标签: c# wpf mvvm treeview caliburn.micro


【解决方案1】:

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>

【讨论】:

  • 非常感谢你,你太棒了!它有效,我只需要稍微编辑 TargetWithoutContext:cal:Action.TargetWithoutContext="{Binding Path=PlacementTarget.Tag.DataContext, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}" 你能更新一下吗答案以供将来参考?现在我有最后一个问题:如何将绑定到 TreeViewItem 的对象传递给 RemoveResource?再次感谢!!!
  • 我已经更新了答案。如果您有新问题,请提出新问题。在 cmets 里回答有点乱。
  • 我自己发现的,就像使用 [Action RemoveResource($datacontext)] 一样简单。再次非常感谢,我真的不知道如何解决! :)
猜你喜欢
  • 2017-03-02
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 2014-02-25
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
相关资源
最近更新 更多