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中发生了什么有什么想法吗?
非常感谢您的帮助!
ContextMenu
驻留在其自己的可视化树中,不能使用ElementName
绑定到TreeView
。
你可以尝试将TreeViewItem
的Tag
属性绑定到父TreeView
,然后使用ContextMenu
的PlacementTarget
属性绑定到它:
<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 = “{绑定路径= PlacementTarget.Tag.DataContext,的RelativeSource = {的RelativeSource模式= FindAncestor,AncestorType =文本菜单}}” 莫非你请更新答案以供将来参考? 现在我有最后一个问题:我如何将绑定到TreeViewItem的对象传递给RemoveResource?再次感谢!!! – Brutus
我已经更新了答案。如果您有新问题,请提出一个新问题。在评论中回答有点麻烦。 – mm8
我自己找到了,就像使用[Action RemoveResource($ datacontext)]一样简单。 非常感谢你,我真的不知道如何解决! :) – Brutus
是RemoveResource()应该有一个对象obj参数? – gabba
http://caliburnmicro.codeplex.com/discussions/287228检查这是否适合你(EisenbergEffect的最后一篇文章)。 – ShadeOfGrey