在一次使用WPF ListView的时候,我发现在MVVM模式下在ListView开启虚拟化的情况下,将ListViewItem的IsSelected属性与一个对应的布尔值进行双向绑定。

文档目录结构如下:

源码如下:

NotifyBase.cs

using System.ComponentModel;
using System.Runtime.CompilerServices;namespace WpfApp10
{public class NotifyBase : INotifyPropertyChanged{public event PropertyChangedEventHandler PropertyChanged;public void DoNotify([CallerMemberName]string name = ""){// 提醒界面更新绑定的属性PropertyChanged?.Invoke(name, new PropertyChangedEventArgs(name));}}
}

MainViewModel.cs(还另外包含一个Demo类型与ListViewItem进行数据绑定)

using System.Collections.ObjectModel;namespace WpfApp10
{public class MainViewModel : NotifyBase{private ObservableCollection<Demo> _demoCollection;public ObservableCollection<Demo> DemoCollection{get{return _demoCollection;}set{_demoCollection = value;DoNotify();}}public MainViewModel(){DemoCollection = new ObservableCollection<Demo>();for(int i = 0; i < 1000; i++){DemoCollection.Add(new Demo{Index = i,Name = "name" + i,IsSelected = false});}}}public class Demo : NotifyBase{private int _index;public int Index{get{return _index;}set{_index = value;DoNotify();}}private string _name;public string Name{get{return _name;}set{_name = value;DoNotify();}}private bool _isSelected;public bool IsSelected{get{return _isSelected;}set{_isSelected = value;DoNotify();}}}
}

MainWindow.xaml

<Window x:Class="WpfApp10.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WpfApp10"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"><Window.DataContext><local:MainViewModel x:Name="vm"/></Window.DataContext><Grid><ListView ItemsSource="{Binding DemoCollection}" Margin="20"><ListView.ItemContainerStyle><Style TargetType="ListViewItem"><Setter Property="IsSelected" Value="{Binding IsSelected}"/></Style></ListView.ItemContainerStyle><ListView.View><GridView><GridViewColumn Width="80" Header="下标" DisplayMemberBinding="{Binding Index}"/><GridViewColumn Width="100" Header="姓名" DisplayMemberBinding="{Binding Name}"/></GridView></ListView.View></ListView></Grid>
</Window>

MainWindow.xaml.cs

using System.Threading.Tasks;
using System.Windows;namespace WpfApp10
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}}
}

操作如下:
先鼠标左键单击一行。

同时按下Shift与鼠标左键。

单击显示为第二行(显示为1)当前View其他ListViewItem选中状态被清空。

翻至下面的View发现选中较为错乱,很多应该被取消选中的的ListViewItem依然是被选中的状态。

通过百度找了很多博客看了以后,终于找到一种现在看来较为可行的办法,因为之前查找不易,特来记录:

那就是在ListView的SelectionChanged事件中加入:

private void ListView_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e){foreach(Demo demo in e.AddedItems.OfType<Demo>()){demo.IsSelected = true;}foreach(Demo demo in e.RemovedItems.OfType<Demo>()){demo.IsSelected = false;}}

反复操作了十几次,问题没有复现,暂定为问题已解决。大家还有其他方法吗?如果有的话感谢分享哟!

解决WPF ListView虚拟化ListViewItem的IsSelected属性MVVM双向绑定bool值后出现的绑定错乱的问题相关推荐

  1. WPF ListView中自动生成的列

    目录 介绍 为什么我们在这里 使用情况 其他可选的视觉样式 ColWidth属性 ColSort属性 ColCellTemplate属性 另一种样式选项--排序箭头颜色 代码 属性 排序装饰器 Aut ...

  2. [WPF]ListView点击列头排序功能实现

    [WPF]ListView点击列头排序功能实现 这是一个非常常见的功能,要求也很简单,在Column Header上显示一个小三角表示表示现在是在哪个Header上的正序还是倒序就可以了.微软的MSD ...

  3. 解决WPF中重载Window.OnRender函数失效问题

    原文:解决WPF中重载Window.OnRender函数失效问题 今天实验一个绘图算法的时候,偶然发现重载Window.OnRender的方法是没有效果的. public partial class ...

  4. 解决 WPF 绑定集合后数据变动界面却不更新的问题(使用 ObservableCollection)

    解决 WPF 绑定集合后数据变动界面却不更新的问题 独立观察员 2020 年 9 月 9 日 在 .NET Core 3.1 的 WPF 程序中打算用 ListBox 绑定显示一个集合(满足需求即可, ...

  5. 解决 WPF 绑定集合后数据变动界面却不更新的问题

    解决 WPF 绑定集合后数据变动界面却不更新的问题 独立观察员 2020 年 9 月 9 日 在 .NET Core 3.1 的 WPF 程序中打算用 ListBox 绑定显示一个集合(满足需求即可, ...

  6. C#中WPF ListView绑定数据的实例详解

    C#中WPF ListView绑定数据的实例详解 发布时间: 2019-03-09 19:29:46 来源: 互联网 作者: 晨曦888 栏目: C#教程 点击: 298 这篇文章主要介绍了C#中WP ...

  7. C# WPF ListView控件的实例详解

    C#的WPF作为现在微软主流的桌面程序开发平台,相比过去的MFC时代,有了非常多的不同.本人刚从MFC平台转过来,以为可以轻松上手,哪知碰到了很多问题,十分不解.不得不乖乖回去看了本书,再继续回到边左 ...

  8. VUE项目中使用this.$forceUpdate();解决页面v-for中修改item属性值后页面v-if不改变的问题

    VUE项目中使用this.$forceUpdate();解决页面v-for中修改item属性值后页面v-if不改变的问题 参考文章: (1)VUE项目中使用this.$forceUpdate();解决 ...

  9. 解决javascript动态改变img的src属性图片不显示问题

    解决javascript动态改变img的src属性图片不显示问题 参考文章: (1)解决javascript动态改变img的src属性图片不显示问题 (2)https://www.cnblogs.co ...

最新文章

  1. 理解LSTM 网络Understanding LSTM Networks
  2. 【转载】十年学会编程
  3. 微软企业库连接access,web.config相对路径配置
  4. 深度学习(2)--常见概率分布(2)
  5. Silverlight与Flash在FF中的一些注意点
  6. MPU:鸿蒙轻内核的任务栈的溢出检察官
  7. 2019.01.13 bzoj4137: [FJOI2015]火星商店问题(线段树分治+可持久化01trie)
  8. 关于SQL的Group By
  9. 80后屌丝站长自曝日赚6000(纯分享贴)
  10. ionic tab(选项卡)
  11. python中in,not in,比较运算符,格式化输出,编码
  12. 万稞pw80线切割编程软件_零基础如何快速学习UG数控编程?
  13. 一看就懂:正则表达式
  14. 桌面cpu与服务器cpu天梯,桌面CPU性能排行 CPU天梯图2017年6月最新版
  15. Ellisys Bluetooth Sniffer 文档 (EEN-BT09) - 访问链接密钥的方法
  16. MySQl 实现 FULL JOIN
  17. layui 动态绑定下拉框
  18. Fiddler抓包6-get请求(url详解)
  19. 第一章、计算机网络与英特网(重点知识梳理)
  20. Nexus 3.31.1 maven 私服 服务器配置篇 linux

热门文章

  1. ubuntu linux 32 16.04root密码,Ubuntu 16.04 Xenial:如何重置密码(忘记密码)
  2. 肖博数学高考数学二轮复习方法统计与统计案例
  3. 基于Linux的智能家居的设计(3)
  4. 6个可以改变一生的宝藏APP,他坚持学习了3年,如今月薪涨到5万
  5. 服务器上安装ubuntu server 20.04.1安装后分辨率只有640*480的解决方法
  6. java中带参数匿名内部类_Java中的匿名内部类
  7. 一起来了解首钢滑雪大跳台吧
  8. 《计算机视觉》集大网课笔记【2】
  9. 训练神经网络的秘诀,Andrej Karpathy大神的刷屏之作
  10. 使用SqlSession