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
的选中模式为“扩展模式”,允许用户通过按下Ctrl
或Shift
键选择多个项目。
- 设置
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属性。 - 通过
GetValue
和SetValue
方法,可以方便地获取和设置SelectedItemsProperty
的值。
4. 附加行为(OnAttached
)
protected override void OnAttached()
{base.OnAttached();AssociatedObject.SelectionChanged += OnSelectionChanged;
}
OnAttached
:- 当行为被附加到
ListView
控件时,会调用此方法。 AssociatedObject
:- 表示行为所附加的控件,在这里是
ListView
。
- 表示行为所附加的控件,在这里是
AssociatedObject.SelectionChanged += OnSelectionChanged
:- 订阅了
ListView
的SelectionChanged
事件,当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
类的作用是:
- 扩展
ListView
的功能:- 通过行为机制,为
ListView
添加了对多选项目的支持,并将其与视图模型中的ObservableCollection<SchemeItem>
属性进行双向绑定。
- 通过行为机制,为
- 自动更新选中项:
- 当用户在
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 拍摄美化功能的简洁介绍,整合核心能力与技术亮点: 一、AI 影像创新 AI 魔法移图 系统级图像分层技术实现人物/物体自由拖拽、缩放与复制,突破传统构图限制。自动分离主体与背景,一键生成错位创意照&…...

《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 片段…...

Ubuntu20.04中 Redis 的安装和配置
Ubuntu20.04 中 Redis 的安装和配置 Ubuntu 安装 MySQL 及其配置 1. Redis 的安装 更新系统包列表并安装 Redis : # 更新包管理工具 sudo apt update# -y:自动确认所有提示(非交互式安装) sudo apt install -y redis-server测…...
从游戏到自动驾驶:互联网时代强化学习如何让机器学会自主决策?
一、为什么机器需要“试错学习”?——强化学习的核心秘密 你有没有玩过《超级马里奥》?当你操控马里奥躲避乌龟、跳过悬崖时,其实就在用一种“试错”的方法学习最优路径。强化学习(Reinforcement Learning, RL)就是让…...

实验四:图像灰度处理
实验四 图像处理实验报告 目录 实验目的实验内容 原理描述Verilog HDL设计源代码Testbench仿真代码及仿真结果XDC文件配置下板测试 实验体会实验照片 实验目的 在实验三的基础上,将图片显示在显示器上,并进行灰度处理。 实验内容 原理描述 1. 图片的…...
asp.net mvc如何简化控制器逻辑
在ASP.NET MVC中,可以通过以下方法简化控制器逻辑: ASP.NET——MVC编程_aspnet mvc-CSDN博客 .NET/ASP.NET MVC Controller 控制器(IController控制器的创建过程) https://cloud.tencent.com/developer/article/1015115 【转载…...

解析“与此站点的连接不安全”警告:成因与应对策略
一、技术本质:SSL/TLS协议的信任链断裂 现代浏览器通过SSL/TLS协议建立加密通信,其核心在于证书颁发机构(CA)构建的信任链。当用户访问网站时,浏览器会验证服务器证书的有效性,包括: 证书链完…...
PyCharm和VS Code哪个更适合初学者
对于 Python 初学者来说,选择 VS Code 还是 PyCharm 取决于你的具体需求和使用场景。以下是两者的详细对比和推荐建议: VS Code 优点: 轻量级:启动速度快,占用资源少,适合在低端设备上运行。高度可定制&am…...

⚡️ Linux Docker 基本命令参数详解
🐳 Linux Docker 基本命令参数详解 📘 1. Docker 简介 Docker 是一个开源的容器化平台,它通过将应用及其依赖打包到一个轻量级、可移植的容器中,从而实现跨平台运行。Docker 采用 C/S 架构,服务端称为 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. 工作流程示例(互斥锁)4. 优势5. 注意事项6. 典型应用 二、Linux中用户态的锁和内核的锁不是同一个实现吗?2.1 本质区别2.2 用户态锁如何工作(以 pthread_mutex 为例ÿ…...
Android第十五次面试总结(第三方组件和adb命令)
Android 第三方组件转为系统组件核心流程 这通常是在进行 Android 系统定制(如 ROM 开发、固件制作)时完成,目的是让第三方应用拥有更高的权限和系统身份。主要过程如下: 核心准备:签名!赋予系统身份 …...

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

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 等引擎,统一了实时分析架构,并广泛应用于广告实时数仓、日志平台和会员报表分析等典型场景中,带来导入性能提升 3~30 倍ÿ…...
隐函数 因变量确定标准
涉及多元隐函数求导法的逻辑本质:当我们对隐函数关系 F ( x , y , z ) 0 F(x, y, z) 0 F(x,y,z)0 使用偏导法求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z时,为什么「偏导」能确定谁是因变量?为什么只有当对 z z z 的偏导 F z…...

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

Grafana 地图本土化方案:使用高德地图API平替GeoMap地图指南
[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] 📢 大家好,我是 WeiyiGeek,一名深耕安全运维开发(SecOpsDev)领域的技术从业者,致力于探索DevOps与安全的融合(De…...
Python爬虫实战:研究demiurge框架相关技术
1. 引言 在当今数字化时代,互联网上蕴含着海量的有价值信息。爬虫技术作为获取这些信息的重要手段,被广泛应用于学术研究、商业分析、舆情监测等多个领域。然而,构建一个高效、稳定且可维护的爬虫系统面临诸多挑战,如网页结构复杂多变、反爬机制日益严格、数据处理流程繁琐…...

3 个优质的终端 GitHub 开源工具
1、Oh My Zsh Oh My Zsh 是一个帮助你管理和美化 zsh 终端的开源工具。它让你的终端更炫酷、更高效。安装后,你可以快速使用各种插件和主题,比如常见的 git 命令简化、支持多种编程语言工具等,每次打开终端都会有惊喜。无论你是开发者还是普…...
F(x, y, z) = 0 隐函数微分 确定自变量
多元隐函数偏导的通用公式: 设一个隐函数由三元函数定义: 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),即 z z z 是 x , y x, y x,y 的函数,满足这个等式恒成立。则有以下公式&am…...

亚马逊AWS云服务器高效使用指南:最大限度降低成本的实战策略
对于初次接触云计算的企业或个人开发者而言,亚马逊云服务器(Amazon EC2)的配置与成本控制往往面临双重挑战:既要理解数百种实例规格的技术参数,又要避免因配置不当导致的资源浪费。本文将深入剖析AWS EC2的核心使用场景…...

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

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

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

【Mini-F5265-OB开发板试用测评】显示RTC日历时钟
一、前言 本章节承接上期的【Mini-F5265-OB开发板试用测评】硬件SPI方式驱动LCD屏帖子上。灵动微官方提供的“LibSamples_MM32F5260_V0.10.2”SDK中包含一个RTC日历的参考例程,因此将该功能移植到上期工程中,即可达成在LCD屏上显示RTC日历时钟。 官方提…...
【生活】程序员防猝si指南
note 一、定期体检二、均衡饮食,多食用对心脏有保护作用的食物三、每周运动四、减压五、保证睡眠六、戒烟限酒7、控制血压8、警惕流感攻击心脏9、关注牙齿健康10、不要抵触吃药 文章目录 note一、定期体检二、均衡饮食,多食用对心脏有保护作用的食物三、…...
CommandLineRunner详细教程
文章目录 1. CommandLineRunner基础概念和背景1.1 什么是CommandLineRunner?1.1.1 核心概念1.1.2 接口定义 1.2 为什么需要CommandLineRunner?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…...