当前位置: 首页 > article >正文

wpf Behaviors库实现支持多选操作进行后台绑定数据的ListView

请添加图片描述

 <ListView ItemsSource="{Binding SchemeItems}" SelectionMode="Extended"   VerticalAlignment="Stretch" HorizontalAlignment="Stretch"><ListView.ContextMenu><ContextMenu><MenuItem Header="删除" Command="{Binding DeleteSelectedItemCommand}"/></ContextMenu></ListView.ContextMenu><i:Interaction.Behaviors><behaviors:SelectedItemsBehavior SelectedItems="{Binding SelectedSchemeItems, Mode=TwoWay}"/></i:Interaction.Behaviors><ListView.View><GridView><GridViewColumn Header="方案名"  DisplayMemberBinding="{Binding Name}"/></GridView></ListView.View></ListView>

1. ListView控件的定义

<ListView ItemsSource="{Binding SchemeItems}" SelectionMode="Extended" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
  • ItemsSource="{Binding SchemeItems}"
    • 这是数据绑定的属性,表示ListView的数据源绑定到视图模型(ViewModel)中的SchemeItems属性。
    • SchemeItems应该是一个集合类型(如ObservableCollection),其中存储了要显示在ListView中的数据项。
  • SelectionMode="Extended"
    • 设置ListView的选中模式为“扩展模式”,允许用户通过按下CtrlShift键选择多个项目。
  • VerticalAlignment="Stretch"HorizontalAlignment="Stretch"
    • 这两个属性设置ListView在父容器中垂直和水平方向上拉伸以填充可用空间。

2. 上下文菜单(ContextMenu

<ListView.ContextMenu><ContextMenu><MenuItem Header="删除" Command="{Binding DeleteSelectedItemCommand}"/></ContextMenu>
</ListView.ContextMenu>
  • ContextMenu
    • 定义了ListView的上下文菜单,即用户右键单击ListView时显示的菜单。
  • MenuItem Header="删除" Command="{Binding DeleteSelectedItemCommand}"
    • 定义了一个菜单项,标题为“删除”。
    • Command="{Binding DeleteSelectedItemCommand}"
      • 绑定了一个命令,当用户点击“删除”菜单项时,会触发视图模型中的DeleteSelectedItemCommand命令。
      • 这个命令通常用于删除选中的项目。

3. 行为(Interaction.Behaviors

<i:Interaction.Behaviors><behaviors:SelectedItemsBehavior SelectedItems="{Binding SelectedSchemeItems, Mode=TwoWay}"/>
</i:Interaction.Behaviors>
  • Interaction.Behaviors
    • 使用了System.Windows.Interactivity命名空间(通常通过xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"引入)来添加行为。
  • behaviors:SelectedItemsBehavior
    • 这是一个自定义行为,可能是为了处理ListView的多选项目。
  • SelectedItems="{Binding SelectedSchemeItems, Mode=TwoWay}"
    • 将行为的SelectedItems属性与视图模型中的SelectedSchemeItems属性进行双向绑定。
    • 这样,当用户在ListView中选择项目时,SelectedSchemeItems会自动更新,反之亦然。

4. ListView的视图(ListView.View

<ListView.View><GridView><GridViewColumn Header="方案名" DisplayMemberBinding="{Binding Name}"/></GridView>
</ListView.View>
  • ListView.View
    • 定义了ListView的显示方式,这里使用了GridView,即表格视图。
  • GridViewColumn Header="方案名" DisplayMemberBinding="{Binding Name}"
    • 定义了一个表格列,标题为“方案名”。
    • DisplayMemberBinding="{Binding Name}"
      • 表示该列显示的数据项的Name属性值。
      • 假设SchemeItems集合中的每个项目都有一个Name属性,那么这个属性的值将显示在该列中。
public class SelectedItemsBehavior : Behavior<ListView>
{public static readonly DependencyProperty SelectedItemsProperty =DependencyProperty.Register(nameof(SelectedItems),typeof(ObservableCollection<SchemeItem>),typeof(SelectedItemsBehavior),new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));public ObservableCollection<SchemeItem> SelectedItems{get => (ObservableCollection<SchemeItem>)GetValue(SelectedItemsProperty);set => SetValue(SelectedItemsProperty, value);}protected override void OnAttached(){base.OnAttached();AssociatedObject.SelectionChanged += OnSelectionChanged;}protected override void OnDetaching(){AssociatedObject.SelectionChanged -= OnSelectionChanged;base.OnDetaching();}private void OnSelectionChanged(object sender, SelectionChangedEventArgs e){SelectedItems = new ObservableCollection<SchemeItem>(AssociatedObject.SelectedItems.Cast<SchemeItem>());}
}

下面代码定义了一个名为SelectedItemsBehavior的行为类,用于扩展ListView的功能,特别是处理多选项目并将其与视图模型绑定:

1. 类定义

public class SelectedItemsBehavior : Behavior<ListView>
  • Behavior<ListView>
    • 这是一个从System.Windows.Interactivity.Behavior<T>继承的类,专门用于为ListView控件添加行为。
    • Behavior<T>是WPF中用于扩展控件功能的机制,允许开发者通过附加行为来增强控件的功能,而无需修改控件本身的代码。

2. 依赖属性(DependencyProperty

public static readonly DependencyProperty SelectedItemsProperty =DependencyProperty.Register(nameof(SelectedItems),typeof(ObservableCollection<SchemeItem>),typeof(SelectedItemsBehavior),new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
  • DependencyProperty.Register
    • 定义了一个名为SelectedItemsProperty的依赖属性,用于存储选中的项目集合。
    • nameof(SelectedItems):属性的名称。
    • typeof(ObservableCollection<SchemeItem>):属性的类型,表示选中的项目是一个ObservableCollection<SchemeItem>集合。
    • typeof(SelectedItemsBehavior):依赖属性所属的类。
    • FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)
      • 设置了默认值为null
      • 设置了BindsTwoWayByDefault选项,表示该属性默认支持双向绑定。

3. SelectedItems属性

public ObservableCollection<SchemeItem> SelectedItems
{get => (ObservableCollection<SchemeItem>)GetValue(SelectedItemsProperty);set => SetValue(SelectedItemsProperty, value);
}
  • 这是一个包装了SelectedItemsProperty依赖属性的CLR属性。
  • 通过GetValueSetValue方法,可以方便地获取和设置SelectedItemsProperty的值。

4. 附加行为(OnAttached

protected override void OnAttached()
{base.OnAttached();AssociatedObject.SelectionChanged += OnSelectionChanged;
}
  • OnAttached
    • 当行为被附加到ListView控件时,会调用此方法。
    • AssociatedObject
      • 表示行为所附加的控件,在这里是ListView
    • AssociatedObject.SelectionChanged += OnSelectionChanged
      • 订阅了ListViewSelectionChanged事件,当ListView的选中项发生变化时,会触发OnSelectionChanged方法。

5. 分离行为(OnDetaching

protected override void OnDetaching()
{AssociatedObject.SelectionChanged -= OnSelectionChanged;base.OnDetaching();
}
  • OnDetaching
    • 当行为从ListView控件分离时,会调用此方法。
    • AssociatedObject.SelectionChanged -= OnSelectionChanged
      • 取消订阅SelectionChanged事件,以避免内存泄漏。

6. 处理选中项变化(OnSelectionChanged

private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{SelectedItems = new ObservableCollection<SchemeItem>(AssociatedObject.SelectedItems.Cast<SchemeItem>());
}
  • OnSelectionChanged
    • ListView的选中项发生变化时,此方法会被触发。
    • AssociatedObject.SelectedItems
      • 获取ListView当前选中的项目集合。
    • Cast<SchemeItem>()
      • 将选中的项目集合转换为SchemeItem类型的集合。
    • new ObservableCollection<SchemeItem>(...)
      • 创建一个新的ObservableCollection<SchemeItem>实例,并将其赋值给SelectedItems属性。
      • 这样,SelectedItems属性会实时更新,反映当前ListView的选中项。

总结

SelectedItemsBehavior类的作用是:

  1. 扩展ListView的功能
    • 通过行为机制,为ListView添加了对多选项目的支持,并将其与视图模型中的ObservableCollection<SchemeItem>属性进行双向绑定。
  2. 自动更新选中项
    • 当用户在ListView中选择或取消选择项目时,SelectedItems属性会自动更新,确保视图模型中的数据与用户界面保持一致。

通过在XAML中使用<behaviors:SelectedItemsBehavior SelectedItems="{Binding SelectedSchemeItems, Mode=TwoWay}"/>,可以将ListView的选中项与视图模型中的SelectedSchemeItems属性绑定,实现数据的双向同步。

相关文章:

wpf Behaviors库实现支持多选操作进行后台绑定数据的ListView

<ListView ItemsSource"{Binding SchemeItems}" SelectionMode"Extended" VerticalAlignment"Stretch" HorizontalAlignment"Stretch"><ListView.ContextMenu><ContextMenu><MenuItem Header"删除" …...

【HarmonyOS 5】拍摄美化开发实践介绍以及详细案例

以下是 HarmonyOS 5 拍摄美化功能的简洁介绍&#xff0c;整合核心能力与技术亮点&#xff1a; 一、AI 影像创新 ‌AI 魔法移图‌ 系统级图像分层技术实现人物/物体自由拖拽、缩放与复制&#xff0c;突破传统构图限制。自动分离主体与背景&#xff0c;一键生成错位创意照&…...

《Vuejs设计与实现》第 8 章(挂载与更新)

目录 8.1 挂载子节点与属性 8.2 HTML Attributes 与 DOM Properties 8.3 设置元素属性的正确方式 8.4 处理 class 属性 8.5 卸载操作 8.6 区分 vnode 类型 8.7 事件处理优化 8.8 事件冒泡与更新时机问题 8.9 子节点的更新 8.10 文本节点和注释节点 8.11 片段&#xf…...

Ubuntu20.04中 Redis 的安装和配置

Ubuntu20.04 中 Redis 的安装和配置 Ubuntu 安装 MySQL 及其配置 1. Redis 的安装 更新系统包列表并安装 Redis &#xff1a; # 更新包管理工具 sudo apt update# -y&#xff1a;自动确认所有提示&#xff08;非交互式安装&#xff09; sudo apt install -y redis-server测…...

从游戏到自动驾驶:互联网时代强化学习如何让机器学会自主决策?

一、为什么机器需要“试错学习”&#xff1f;——强化学习的核心秘密 你有没有玩过《超级马里奥》&#xff1f;当你操控马里奥躲避乌龟、跳过悬崖时&#xff0c;其实就在用一种“试错”的方法学习最优路径。强化学习&#xff08;Reinforcement Learning, RL&#xff09;就是让…...

实验四:图像灰度处理

实验四 图像处理实验报告 目录 实验目的实验内容 原理描述Verilog HDL设计源代码Testbench仿真代码及仿真结果XDC文件配置下板测试 实验体会实验照片 实验目的 在实验三的基础上&#xff0c;将图片显示在显示器上&#xff0c;并进行灰度处理。 实验内容 原理描述 1. 图片的…...

asp.net mvc如何简化控制器逻辑

在ASP.NET MVC中&#xff0c;可以通过以下方法简化控制器逻辑&#xff1a; ASP.NET——MVC编程_aspnet mvc-CSDN博客 .NET/ASP.NET MVC Controller 控制器&#xff08;IController控制器的创建过程&#xff09; https://cloud.tencent.com/developer/article/1015115 【转载…...

解析“与此站点的连接不安全”警告:成因与应对策略

一、技术本质&#xff1a;SSL/TLS协议的信任链断裂 现代浏览器通过SSL/TLS协议建立加密通信&#xff0c;其核心在于证书颁发机构&#xff08;CA&#xff09;构建的信任链。当用户访问网站时&#xff0c;浏览器会验证服务器证书的有效性&#xff0c;包括&#xff1a; 证书链完…...

PyCharm和VS Code哪个更适合初学者

对于 Python 初学者来说&#xff0c;选择 VS Code 还是 PyCharm 取决于你的具体需求和使用场景。以下是两者的详细对比和推荐建议&#xff1a; VS Code 优点&#xff1a; 轻量级&#xff1a;启动速度快&#xff0c;占用资源少&#xff0c;适合在低端设备上运行。高度可定制&am…...

⚡️ Linux Docker 基本命令参数详解

&#x1f433; Linux Docker 基本命令参数详解 &#x1f4d8; 1. Docker 简介 Docker 是一个开源的容器化平台&#xff0c;它通过将应用及其依赖打包到一个轻量级、可移植的容器中&#xff0c;从而实现跨平台运行。Docker 采用 C/S 架构&#xff0c;服务端称为 Docker Daemon&a…...

做题笔记(ctfshow)

一。ctfshow web13 文件扫描 存在upload.php.bak <?php header("content-type:text/html;charsetutf-8");$filename $_FILES[file][name];$temp_name $_FILES[file][tmp_name];$size $_FILES[file][size];$error $_FILES[file][error];$arr pathinfo($fi…...

Linux 用户层 和 内核层锁的实现

目录 一、系统调用futex介绍1. 核心机制2. 常见操作3. 工作流程示例&#xff08;互斥锁&#xff09;4. 优势5. 注意事项6. 典型应用 二、Linux中用户态的锁和内核的锁不是同一个实现吗&#xff1f;2.1 本质区别2.2 用户态锁如何工作&#xff08;以 pthread_mutex 为例&#xff…...

Android第十五次面试总结(第三方组件和adb命令)

Android 第三方组件转为系统组件核心流程 这通常是在进行 Android 系统定制&#xff08;如 ROM 开发、固件制作&#xff09;时完成&#xff0c;目的是让第三方应用拥有更高的权限和系统身份。主要过程如下&#xff1a; ​核心准备&#xff1a;签名&#xff01;赋予系统身份​ …...

Agent短期记忆的几种持久化存储方式

今天给大家讲一下关于Agent长期对话的几种持久化存储方式&#xff0c;之前的文章给大家说过短期记忆和长期记忆&#xff0c;短期记忆基于InMemorySaver做checkpointer&#xff08;检查点&#xff09;&#xff0c;短期记忆 &#xff08;线程级持久性&#xff09; 使代理能够跟踪…...

Git 常见操作

目录 1.git stash 2.合并多个commit 3. git commit -amend (后悔药) 4.版本回退 5.merge和rebase 6.cherry pick 7.分支 8.alias 1.git stash git-stash操作_git stash 怎么增加更改内容-CSDN博客 2.合并多个commit 通过git bash工具交互式操作。 1.查询commit的c…...

从 ClickHouse、Druid、Kylin 到 Doris:网易云音乐 PB 级实时分析平台降本增效

网易云音乐基于 Apache Doris 替换了早期架构中 Kylin、Druid、Clickhouse、Elasticsearch、HBase 等引擎&#xff0c;统一了实时分析架构&#xff0c;并广泛应用于广告实时数仓、日志平台和会员报表分析等典型场景中&#xff0c;带来导入性能提升 3&#xff5e;30 倍&#xff…...

隐函数 因变量确定标准

涉及多元隐函数求导法的逻辑本质&#xff1a;当我们对隐函数关系 F ( x , y , z ) 0 F(x, y, z) 0 F(x,y,z)0 使用偏导法求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z​时&#xff0c;为什么「偏导」能确定谁是因变量&#xff1f;为什么只有当对 z z z 的偏导 F z…...

Facebook接入说明

Facebook 原生 Messenger 聊天消息接入到一洽对话中 1、创建 Facebook 主页 进入 https://www.facebook.com/pages/create 页面根据提示创建主页&#xff08;如果已经有待用主页&#xff0c;可跳过&#xff09; 2、授权对话权限 1、向您的一洽负责人获取 Facebook 授权链接 2、…...

Grafana 地图本土化方案:使用高德地图API平替GeoMap地图指南

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] &#x1f4e2; 大家好&#xff0c;我是 WeiyiGeek&#xff0c;一名深耕安全运维开发&#xff08;SecOpsDev&#xff09;领域的技术从业者&#xff0c;致力于探索DevOps与安全的融合&#xff08;De…...

Python爬虫实战:研究demiurge框架相关技术

1. 引言 在当今数字化时代,互联网上蕴含着海量的有价值信息。爬虫技术作为获取这些信息的重要手段,被广泛应用于学术研究、商业分析、舆情监测等多个领域。然而,构建一个高效、稳定且可维护的爬虫系统面临诸多挑战,如网页结构复杂多变、反爬机制日益严格、数据处理流程繁琐…...

3 个优质的终端 GitHub 开源工具

1、Oh My Zsh Oh My Zsh 是一个帮助你管理和美化 zsh 终端的开源工具。它让你的终端更炫酷、更高效。安装后&#xff0c;你可以快速使用各种插件和主题&#xff0c;比如常见的 git 命令简化、支持多种编程语言工具等&#xff0c;每次打开终端都会有惊喜。无论你是开发者还是普…...

F(x, y, z) = 0 隐函数微分 确定自变量

多元隐函数偏导的通用公式&#xff1a; 设一个隐函数由三元函数定义&#xff1a; F ( x , y , z ) 0 F(x, y, z) 0 F(x,y,z)0 且假设 z z ( x , y ) z z(x, y) zz(x,y)&#xff0c;即 z z z 是 x , y x, y x,y 的函数&#xff0c;满足这个等式恒成立。则有以下公式&am…...

亚马逊AWS云服务器高效使用指南:最大限度降低成本的实战策略

对于初次接触云计算的企业或个人开发者而言&#xff0c;亚马逊云服务器&#xff08;Amazon EC2&#xff09;的配置与成本控制往往面临双重挑战&#xff1a;既要理解数百种实例规格的技术参数&#xff0c;又要避免因配置不当导致的资源浪费。本文将深入剖析AWS EC2的核心使用场景…...

Android设备推送traceroute命令进行网络诊断

文章目录 工作原理下载traceroute for android推送到安卓设备执行traceroutetraceroute www.baidu.com Traceroute&#xff08;追踪路由&#xff09; 是一个用于网络诊断的工具&#xff0c;主要用于追踪数据包从源主机到目标主机所经过的路由路径&#xff0c;以及每一跳&#x…...

github开源协议选择

文章目录 怎么选协议宽松型协议 Permissive Licenses传染型协议 怎么选协议 希望代码被广泛使用&#xff0c;允许闭源 MIT、Apache 2.0、BSD需要专利保护 Apache 2.0强制开源衍生作品 GPL、AGPL开发库&#xff0c;允许闭源调用 LGPL云服务项目&#xff0c;防止白嫖 AGPL企业级…...

详解Jenkins Pipeline 中git 命令的使用方法

在 Jenkins Pipeline 中&#xff0c;git 命令是用于从版本控制系统&#xff08;如 Git&#xff09;拉取代码的核心步骤。其用法灵活&#xff0c;支持多种配置参数&#xff0c;但需要遵循 Jenkins 流水线语法规范。 一、基础语法 1. 声明式流水线&#xff08;Declarative Pipe…...

【Mini-F5265-OB开发板试用测评】显示RTC日历时钟

一、前言 本章节承接上期的【Mini-F5265-OB开发板试用测评】硬件SPI方式驱动LCD屏帖子上。灵动微官方提供的“LibSamples_MM32F5260_V0.10.2”SDK中包含一个RTC日历的参考例程&#xff0c;因此将该功能移植到上期工程中&#xff0c;即可达成在LCD屏上显示RTC日历时钟。 官方提…...

【生活】程序员防猝si指南

note 一、定期体检二、均衡饮食&#xff0c;多食用对心脏有保护作用的食物三、每周运动四、减压五、保证睡眠六、戒烟限酒7、控制血压8、警惕流感攻击心脏9、关注牙齿健康10、不要抵触吃药 文章目录 note一、定期体检二、均衡饮食&#xff0c;多食用对心脏有保护作用的食物三、…...

CommandLineRunner详细教程

文章目录 1. CommandLineRunner基础概念和背景1.1 什么是CommandLineRunner&#xff1f;1.1.1 核心概念1.1.2 接口定义 1.2 为什么需要CommandLineRunner&#xff1f;1.3 CommandLineRunner的特点1.3.1 执行时机1.3.2 与ApplicationRunner的区别 2. 环境搭建和项目结构2.1 Mave…...

Github 2025-06-05 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2025-06-05统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10TypeScript项目1Go编程语言:构建简单、可靠和高效的软件 创建周期:3474 天开发语言:Go协议类型:BSD 3-Clause “New” or “Revise…...