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

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属性绑定,实现数据的双向同步。

http://www.lqws.cn/news/144055.html

相关文章:

  • MySQL 高可用基石 - 复制监控与常见 HA 方案
  • DBSyncer:开源数据库同步利器,MySQL/Oracle/ES/SqlServer/PG/
  • 企业培训学习考试系统源码 ThinkPHP框架+Uniapp支持多终端适配部署
  • 行列式的性质
  • exp1_code
  • Redis 缓存策略:借助缓存优化数据库性能并保障数据一致性
  • 9.axios底层原理,和promise的对比(2)
  • 外网访问内网服务器常用的三种简单操作步骤方法,本地搭建网址轻松让公网连接
  • 游戏设计模式 - 子类沙箱
  • OCR助力保险业建设
  • 【C++】二叉搜索树
  • ocrapi服务docker镜像使用
  • 从零开始的云计算——番外实战,iptables防火墙项目
  • WordZero:让Markdown与Word文档自由转换的Golang利器
  • 【Go语言基础【2】】数据类型之基础数据类型:数字、字符、布尔、枚举、自定义
  • 1、Go语言基础中的基础
  • 【Go语言基础【四】】局部变量、全局变量、形式参数
  • PPT转图片拼贴工具 v3.0
  • Spark 写文件
  • Dubbo Logback 远程调用携带traceid
  • 41道Django高频题整理(附答案背诵版)
  • PostgreSQL 的扩展pg_prewarm
  • 20250605在微星X99主板中配置WIN10和ubuntu22.04.6双系统启动的引导设置
  • Django CMS 的 Demo
  • NoSQL之Redis配置与优化
  • SQL Server相关的sql语句
  • 嵌入式学习 D33:系统编程--网路编程
  • ubuntu 端口复用
  • Ubuntu20.04设置为开机后直接自动进入纯命令行界面
  • 【Linux】为 Git 设置 Commit 提交模板方法,可统一个人或者项目的提交风格