Caliburn Micro未在ListView中的ContextMenu中找到DataContext

时间:2015-09-09 11:49:40

标签: c# wpf mvvm caliburn.micro

我已经用对象填充了ListView,并且我已将ContextMenu绑定到ListView中的那些项目。只能通过单击项目来打开ContextMenu。问题是Caliburn Micro会抛出一个错误,它无法找到ShowProperties()的目标方法。

我认为出现此问题是因为Caliburn没有可用的ViewModel的正确DataContext。我已经在Stackoverflow上尝试了很多解决方案,使ViewModel可用于ContextMenu项目,但无济于事,例如:

WPF: Binding a ContextMenu to an MVVM Command

“No target found for method” thrown by Caliburn Message.Attach()

WPF Context Menus in Caliburn Micro

这是我的观点的XAML代码:

getValues

我错过了什么?

1 个答案:

答案 0 :(得分:6)

通过放置命令绑定来覆盖CM将执行的操作。由于可视树不知道上下文菜单存在,更不用说背后目的的datacontext。

<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
    <Setter Property="Tag" Value="{Binding Path=DataContext, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListView}}"/>
    <Setter Property="ContextMenu">
        <Setter.Value>
            <ContextMenu cal:Action.TargetWithoutContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
               <MenuItem Header="Properties"  cal:Message.Attach="ShowProperties($dataContext)" >
                <MenuItem.Icon>
                    <Image Source="../PropertyIcon.png" />
                </MenuItem.Icon>
            </MenuItem>
            </ContextMenu>
        </Setter.Value>
    </Setter>
</Style>
</ListView.ItemContainerStyle>

虽然我理解你在使用ListView中的资源尝试做什么,但是你正在使用Command绑定自己。删除资源给ItemContainerStyle一个roll并查看它是否有效。您可以随时将其分解为资源。出于测试目的,看它是否有效,现在试试内部风格。