c# - Caliburn Micro 在 ListView 的 ContextMenu 中找不到 DataContext

标签 c# wpf mvvm caliburn.micro

我已经用对象填充了一个 ListView,并且我已经将 ContextMenu 绑定(bind)到我的 ListView 中的那些项目。上下文菜单只能通过单击一个项目来打开。问题是 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

这是我的 View 的 XAML 代码:

<Window x:Class="CueMaster.Views.AppView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:dragDrop="clr-namespace:GongSolutions.Wpf.DragDrop;assembly=GongSolutions.Wpf.DragDrop"
         xmlns:cal="http://www.caliburnproject.org"
         Height="500" Width="800">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="200" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

    <ListView Grid.Column="1" Margin="5"
        ItemsSource="{Binding Cues}" 
        dragDrop:DragDrop.IsDragSource="True" 
        dragDrop:DragDrop.IsDropTarget="True"
        dragDrop:DragDrop.DropHandler="{Binding}">

        <ListView.Resources>
            <ContextMenu x:Key="ItemContextMenu">
                <MenuItem Header="Properties" cal:Message.Attach="ShowProperties($dataContext)" Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListView}}">
                    <MenuItem.Icon>
                        <Image Source="../PropertyIcon.png" />
                    </MenuItem.Icon>
                </MenuItem>
            </ContextMenu>
        </ListView.Resources>

        <ListView.ItemContainerStyle>
            <Style TargetType="{x:Type ListViewItem}" >
                <Setter Property="ContextMenu" Value="{StaticResource ItemContextMenu}" />
            </Style>
        </ListView.ItemContainerStyle>

        <ListView.View>
            <GridView >
                <GridViewColumn Width="70" Header="Cue"  DisplayMemberBinding="{Binding Id}" />
                <GridViewColumn Width="100" Header="Name"  DisplayMemberBinding="{Binding Name}" />
                <GridViewColumn Width="100" Header="Description"  DisplayMemberBinding="{Binding Description}" />
                <GridViewColumn Width="70" Header="Duration"  DisplayMemberBinding="{Binding Duration}" />
                <GridViewColumn Width="70" Header="Elapsed"  DisplayMemberBinding="{Binding Elapsed}" />
                <GridViewColumn Width="70" Header="Remaining"  DisplayMemberBinding="{Binding Remaining}" />
            </GridView>
        </ListView.View>
    </ListView>
</Grid>

我错过了什么?

最佳答案

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

<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 中的资源做什么,但您正在使用命令绑定(bind)搬起石头砸自己的脚。放下资源给 ItemContainerStyle 一个滚动,看看它是否有效。您以后可以随时将其分解为资源。出于测试目的,看看它是否有效,现在试试内部样式。

关于c# - Caliburn Micro 在 ListView 的 ContextMenu 中找不到 DataContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32478792/

相关文章:

c# - 如何在 asp.net mvc 中向现有类或对象添加新类型

c# - 从 WPF 应用程序以编程方式关闭/打开 Wi-Fi

c# - 自定义 ListView 项中的背景/前景功能

WPF 组合框显示问题

javascript - 无法从一个 View 模型更新另一个 View 模型的可观察值

c# - ComboBox SelectedItem 绑定(bind)

c# - 更改android中后退按钮的颜色

c# - 这段代码实际上是多线程的吗?

c# - 有没有办法从 .NET 使用 Kafka Ksql 推送查询

wpf - Windows 8 桌面应用程序 : Open tabtip. exe 到辅助键盘(用于数字文本框)