Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Caliburn Micro在ListView的ContextMenu中找不到DataContext_C#_Wpf_Mvvm_Caliburn.micro - Fatal编程技术网

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

C# Caliburn Micro在ListView的ContextMenu中找不到DataContext,c#,wpf,mvvm,caliburn.micro,C#,Wpf,Mvvm,Caliburn.micro,我用对象填充了ListView,并将ContextMenu绑定到ListView中的这些项。上下文菜单只能通过单击项目打开。问题是Caliburn Micro抛出了一个错误,它无法找到ShowProperties()的目标方法 我认为出现这个问题是因为Caliburn没有ViewModel的正确DataContext可用。我在Stackoverflow上尝试了许多解决方案,以使ViewModel可用于ContextMenu项,但均无效,例如: 这是我的视图的XAML代码: <Wind

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

我认为出现这个问题是因为Caliburn没有ViewModel的正确DataContext可用。我在Stackoverflow上尝试了许多解决方案,以使ViewModel可用于ContextMenu项,但均无效,例如:

这是我的视图的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>


我错过了什么?

您通过放置命令绑定来覆盖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中的资源做什么,但您正在用命令绑定攻击自己。放下资源,滚动ItemContainerStyle,看看它是否有效。您可以随时在以后将其分解为资源。为了测试它是否有效,请暂时尝试内部样式。

使用mvermef的答案,我让它起作用了。在他的代码中唯一需要更改的是绑定意味着“沿着可视化树向上移动,找到此树上方的第一个ContextMenu对象,并绑定到PlacementTarget.Tag属性”。问题是绑定在ContextMenu本身上,因此没有父ContextMenu对象。使用RelativeSource Self修复了这一问题

<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>


谢谢,但遗憾的是,无论是否使用$dataContext,它仍然找不到ShowProperties方法。。我确实收到了这样一条消息:PlacementTarget的标记无法在System.Windows.UIElement的数据上下文类型中解析,任何可能导致此问题的因素?您的项目是如何构造的?分离组件?容器类型(如果有)?我已经使用NuGet引用了Caliburn.Micro和Caliburn.Micro.Platform包。我使用的是正常的Caliburn结构;视图和视图模型目录。完整的视图XML与我发布的一样。我不知道你所说的容器类型是什么意思。我确实是用你的提示来实现的。相反,我将ContextMenu的RelativeSource更改为RelativeSource={RelativeSource Self}。我将在回答中发布完整的XAML。非常感谢@法比安帕斯也许如果这个答案帮助你解决了问题,你可以接受它作为一个答案?:)