美文网首页
WPF中针对ListViewItem设计弹出菜单

WPF中针对ListViewItem设计弹出菜单

作者: 达哥傻乐 | 来源:发表于2024-09-02 10:17 被阅读0次

有WPF中,针对ListView定义的弹出菜单,在Click事件里很难获得当前弹出菜单应对的ListViewItem数据行,如果我们想对特定的数据行右击进行某些操作,操作时需要知道在哪个项目上右击弹出的菜单,需要把弹出菜单定义在ListViewItem上而不是ListView上。
步骤示例如下:

  1. 在xaml中定义弹出菜单的资源:
    <!--定义给ListViewItem用的弹出菜单-->
    <Window.Resources>
        <ContextMenu x:Key="ListViewItemContextMenu">
            <MenuItem Header="编辑" Click="EditMenuItem_Click"/>
            <MenuItem Header="删除" Click="DeleteMenuItem_Click"/>
        </ContextMenu>
    </Window.Resources>
  1. 在ListView里绑定右键菜单
        <ListView ItemsSource="{Binding Products}">

            <ListView.View>
                <GridView>
                    <GridViewColumn Header="备注" DisplayMemberBinding="{Binding remarks}" Width="200"/>
                </GridView>
            </ListView.View>

            <!--这里针对ListViewItem设置上下文菜单,不然等下事件里取不到操作的数据-->
            <ListView.ItemContainerStyle>
                <Style TargetType="{x:Type ListViewItem}">
                    <Setter Property="ContextMenu"  Value="{StaticResource ListViewItemContextMenu}"/>
                </Style>
            </ListView.ItemContainerStyle>
        </ListView>

上面关键的是以下部分:

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

上面的ListViewItemContextMenu实际对应的第一步中定义的右键菜单资源的Key值。

  1. 两个菜单项对应的程序代码简化如下:
// 编辑商品
private void EditMenuItem_Click(object sender, RoutedEventArgs e)
{
    if ((sender as MenuItem).DataContext is not ProductInfo selectedProduct) return;
    ......
}

// 删除商品
private void DeleteMenuItem_Click(object sender, RoutedEventArgs e)
{
    var selectedProduct = (sender as MenuItem).DataContext as ProductInfo;
    if (selectedProduct == null) return;
    ......
}

如此处理就行了。

需要注意的是,不建议使用如下的定义方式,如下的方式没有把右键菜单定义成静态资源,看上去完全没问题,而且能编译通过,但一运行很可能就会报错,至于在哪些版本、哪些平台会报错,不明:

<ListView ItemsSource="{Binding Products}">

    <ListView.View>
        <GridView>
            <GridViewColumn Header="备注" DisplayMemberBinding="{Binding remarks}" Width="200"/>
        </GridView>
    </ListView.View>

    <!--这里针对ListViewItem设置上下文菜单,编译通过,但运行会出错-->
    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <Setter Property="ContextMenu">
                <Setter.Value>
                    <ContextMenu>
                        <MenuItem Header="编辑" Click="EditMenuItem_Click"/>
                        <MenuItem Header="删除" Click="DeleteMenuItem_Click"/>
                    </ContextMenu>
                </Setter.Value>
            </Setter Property>
        </Style>
    </ListView.ItemContainerStyle>
</ListView>

相关文章

网友评论

      本文标题:WPF中针对ListViewItem设计弹出菜单

      本文链接:https://www.haomeiwen.com/subject/odjhljtx.html