【问题标题】:ListView TextBlock context menu is not invoking the bound commandListView TextBlock 上下文菜单未调用绑定命令
【发布时间】:2016-02-10 08:50:22
【问题描述】:

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

【问题讨论】:

    标签: wpf xaml listview mvvm


    【解决方案1】:

    尝试为您的 CommandBinding 提供RelativeSource。像

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

    如果您的 ListViewUserControl 内,请将 AncestoryType=Window 替换为 AncestoryType=UserControl

    【讨论】:

      【解决方案2】:

      ContextMenu 获得的 NameScope 与在 UIElement 中定义的名称范围不同。

      所以绑定(如 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命令定义在ListView的DataContext中。

      【讨论】:

        猜你喜欢
        • 2019-05-24
        • 1970-01-01
        • 2016-06-04
        • 1970-01-01
        • 2012-02-11
        • 1970-01-01
        • 2011-04-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多