ItemContainerStyle 中的 Caliburn Micro Action - 未找到方法的目标
Caliburn Micro Action inside ItemContainerStyle - No target found for method
我正在开发一个使用 Caliburn Micro 作为 MVVM 框架的 WPF 项目,上周我很幸运地在 Whosebug 上找到了任何问题的所有解决方案,但现在我面临我自己无法解决的更大问题。
我有一个包含 TreeView 的视图;树视图的每个项目都应在以下情况下调用一个方法:
- 双击[working]
- 单击其上下文菜单的一个条目[不工作]
这是树视图:
<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
您可以尝试将 TreeViewItem
的 Tag
属性 绑定到父级 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>
我正在开发一个使用 Caliburn Micro 作为 MVVM 框架的 WPF 项目,上周我很幸运地在 Whosebug 上找到了任何问题的所有解决方案,但现在我面临我自己无法解决的更大问题。
我有一个包含 TreeView 的视图;树视图的每个项目都应在以下情况下调用一个方法:
- 双击[working]
- 单击其上下文菜单的一个条目[不工作]
这是树视图:
<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
您可以尝试将 TreeViewItem
的 Tag
属性 绑定到父级 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>