ListView TextBlock上下文菜单未调用绑定命令

时间:2016-02-10 08:50:23

标签: wpf xaml listview mvvm

我的ListView被绑定到ObservableDictionary来源。在ListView控件中,值绑定到TextBlockTextBlock的上下文菜单绑定到事件,但事件未在单击时执行。以下是代码。

<ListView ItemsSource="{Binding Path=Source, Mode=TwoWay}" Grid.Row="0" Height="300">
        <ListView.ItemTemplate>
            <DataTemplate>
                <WrapPanel>
                    <TextBlock Text="{Binding Value}">
                        <TextBlock.ContextMenu>
                            <ContextMenu>
                                <MenuItem Header="Delete">
                                    <i:Interaction.Triggers>
                                        <i:EventTrigger EventName="Click">
                                            <i:InvokeCommandAction Command="{Binding Path= MenuClicked}" CommandParameter="Delete"/>
                                        </i:EventTrigger>
                                    </i:Interaction.Triggers>
                                </MenuItem>
                                <MenuItem Header="Rename">
                                    <i:Interaction.Triggers>
                                        <i:EventTrigger EventName="Click">
                                            <i:InvokeCommandAction Command="{Binding Path= MenuClicked}" CommandParameter="Rename"/>
                                        </i:EventTrigger>
                                    </i:Interaction.Triggers>
                                </MenuItem>
                            </ContextMenu>
                        </TextBlock.ContextMenu>
                    </TextBlock>
                </WrapPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
        <ListView.ContextMenu>
            <ContextMenu>
                <MenuItem Header="Add">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Click">
                            <i:InvokeCommandAction Command="{Binding Path= MenuClicked}" CommandParameter="Add"/>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </MenuItem>
                <MenuItem Header="Import">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Click">
                            <i:InvokeCommandAction Command="{Binding Path= MenuClicked}" CommandParameter="Import"/>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </MenuItem>
            </ContextMenu>
        </ListView.ContextMenu>
    </ListView>

2 个答案:

答案 0 :(得分:0)

尝试为CommandBinding提供RelativeSource。像

这样的东西
<i:InvokeCommandAction Command="{Binding Path=DataContext.MenuClicked, RelativeSource={RelativeSource.FindAncestor, AncestorType=Window}}" CommandParameter="Delete"/>

如果AncestoryType=Window位于AncestoryType=UserControl

内,请将ListView替换为UserControl

答案 1 :(得分:0)

ContextMenu与定义它们的UIElement中的NameScope不同。

所以绑定(如ElementName,Ancestor)通常会产生问题。您必须先在后面的代码中设置名称范围:

NameScope.SetNameScope(contextMenu, NameScope.GetNameScope(this));

contextMenu是您的上下文菜单的x:Name

然后您可以使用相对源绑定或任何其他绑定来执行命令。如下所示:

Command="{Binding  RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x: type ListView}},Path=DataContext.MenuClicked}"

PS:如果在MenuClicked的DataContext中定义了ListView命令。