List和ObservableCollection的转换
1、我们后台查询全部List数据的时候,前台需要ObservableCollection展示
这个时候List需要转换成ObservableCollection
public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> source)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
return new ObservableCollection<T>(source);
}
2、但是这会出现一个问题,假如我们使用的异步查询
var asideMenus = await _asideMenuService.QueryListAsync();
AsideMenus = asideMenus.ToObservableCollection();
此时AsideMenus为空,这是因为asideMenus是在后台查询到的,即使你转化成了ObservableCollection它还没有更新到UI
3、解决方法
解决1、需要使用Foreach,ForEach 是 LINQ 中的一个扩展方法,它遍历集合中的每个元素并对其执行指定的操作。当您在 UI 线程上调用 ForEach 时,它将直接更新 ObservableCollection,并且 CollectionChanged 事件将被触发,从而使 UI 得到更新
(await _asideCreateControlService.QueryListAsync()).ForEach(x => PlayListInputDtos.Add(x));
解决2、使用Dispatcher,WPF 使用 Dispatcher 来管理线程间的操作。当您从后台线程调用 Dispatcher.Invoke 或 Dispatcher.BeginInvoke 时,您实际上是在请求 UI 线程稍后执行指定的操作。这对于更新 UI 控件和集合是必要的,因为 WPF 要求这些操作必须在创建它们的线程上执行
foreach (var menu in await _asideMenuService.QueryListAsync())
{
Dispatcher.CurrentDispatcher.Invoke(() => AsideMenus.Add(menu));
}
解决3、但是当你操作大量UI时,通过减少 Dispatcher.Invoke 的调用次数,您可以减少线程创建和管理的开销,从而提高性能。在这种情况下,您可以先在后台线程中收集所有数据,然后在 UI 线程上一次性更新 ObservableCollection
foreach (var menu in await _asideMenuService.QueryListAsync())
{
Application.Current.Dispatcher.Invoke(() => AsideMenus.Add(menu));
}
解决4、是对解决3的扩展,重写OnCollectionChanged方法
public class ThreadSafeObservableCollection<T> : ObservableCollection<T>
{
public ThreadSafeObservableCollection()
{
}
public ThreadSafeObservableCollection(IEnumerable<T> list) : base(new List<T>(list ?? throw new ArgumentNullException(nameof(list))))
{
}
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
// 确保 CollectionChanged 事件在 UI 线程上触发
if (Thread.CurrentThread.ManagedThreadId == Dispatcher.CurrentDispatcher.Thread.ManagedThreadId)
{
base.OnCollectionChanged(e);
}
else
{
Dispatcher.CurrentDispatcher.Invoke(() => base.OnCollectionChanged(e));
}
}
// 其他需要重写的 OnCollectionChanged 相关方法,如 OnAddingNew, OnRemoved, OnReplaced 等
}
List和ObservableCollection的转换的更多相关文章
- 【WPF】WPF中的List<T>和ObservableCollection<T>
在WPF中 控件绑定数据源时,数据源建议采用 ObservableCollection<T>集合 ObservableCollection<T> 类:表示一个动态数据集合,在添 ...
- WPF DataGrid 列显示0,-1(作废、删除)状态,1,2(支出、收入)类型,操作人(在其他表中),如何转换格式。
操作人,左联,Join on letf //容我补充 状态,类型,类似的转换,在xmlns中引入common xmlns:com="clr-namespace:XXX.Common&qu ...
- 【WPF】WPF DataGrid List数据源 双向绑定通知机制之ObservableCollection使用以及MultiBinding 的应用
以下代码实现了DataGrid的简单绑定List数据源 重点要提一下的是,绑定List数据源,但是不能直接用List.比如下面的代码,使用List<GridItem>只能实现数据修改的绑定 ...
- WPF值转换实例
WPF绑定功能非常方便,有时候点击某值时在另t一处显示此值的另一表现形式或调用其对应的其它值,用WPF值转换功能会很方便,下面就一LISTBOX和TEXTBLOCK控件,把LISTBOX中的值转换成除 ...
- javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈
Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...
- opencv中Mat与IplImage,CVMat类型之间转换
opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...
- ASP.NET_各个币种之间的汇率转换(实时)使用Yahoo汇率。
近期开发支付平台的时候有运用到各国的实时汇率之间的转换问题,于是在往上找了很多相关资料,以下就是一些参考网址: 1.提供API接口的网站:https://www.showapi.com:这个网站有提供 ...
- Taurus.MVC 2.2 开源发布:WebAPI 功能增强(请求跨域及Json转换)
背景: 1:有用户反馈了关于跨域请求的问题. 2:有用户反馈了参数获取的问题. 3:JsonHelper的增强. 在综合上面的条件下,有了2.2版本的更新,也因此写了此文. 开源地址: https:/ ...
- XStream将java对象转换为xml时,对象字段中的下划线“_”,转换后变成了两个的解决办法
在前几天的一个项目中,由于数据库字段的命名原因 其中有两项:一项叫做"市场价格"一项叫做"商店价格" 为了便于区分,遂分别将其命名为market ...
- Android中手机录屏并转换GIF的两种方式
之前在博文中为了更好的给大家演示APP的实现效果,本人了解学习了几种给手机录屏的方法,今天就给大家介绍两种我个人用的比较舒服的两种方法: (1)配置adb环境后,使用cmd命令将手机界面操作演示存为视 ...
随机推荐
- Java判断一个字符串中是否包含数字
知识点 本例考察以下Java知识点: 正则表达式 关于正则表达式: https://www.runoob.com/java/java-regular-expressions.html Characte ...
- SpringBoot+Shiro+LayUI权限管理系统项目-9.核心知识点总结
1.说明 本篇讲一下本项目几个重要的知识点,详细看源码,文章下方捐赠或QQ联系捐赠获取. 2.Shiro如何设置密码加密算法 1.在shiro配置文件中添加: @Bean public HashedC ...
- oracle sqlplus命令详解(官方示例)
以为内容选自Oracle官方文档,只讲command-line: 规范:<变量名> , {举例} , a | b 枚举可选值,(XX)描述 ------------------------ ...
- Java并发编程实例--8.在线程中处理未检查异常
java中有两类异常: 已检查异常:这类异常编译器要求开发者必须在代码中通过throws去处理. 例如:IOException和ClassNotFoundException. 未检查异常:不必显式的在 ...
- vue upload 图片转base64、转二进制数组,保存编码数据到文件
功能需求 1.图片转base64 2.base 64 转二进制数组 3.保存二进制数据到文件下载到本地 解决方法 问题1: 参考资料 vue element upload图片 转换成base64 具体 ...
- 【Azure Logic App】使用Outlook.com发送邮件遇到429报错
问题描述 在Logic App中使用 Outlook.com组件发送邮件,遇见了outlook connection报429的错误 {"error":{"code&quo ...
- 小程序开发:接入腾讯云的人像动漫化api接口
接口如下: 图片的传参方式有两种,一种是传图片的base64,一种是图片url: 我打算免费版使用base64,如果付费用户支持永久存储历史的图片记录(图片存储到腾讯云对象存储中). 前端框架我用的u ...
- 浅谈Zabbix与Prometheus区别
Zabbix和Prometheus都是非常流行的监控系统.它们有许多相似之处,但也有一些不同之处.以下是Zabbix和Prometheus监控对比的一些关键点: 1.数据模型和查询语言 Prometh ...
- 摆脱鼠标系列 - vscode 搜索 自定义快捷键 F1 - 然后F4 搜索 Alt+Shift+回车 跳转到搜索列表 选好后回车进入文件
摆脱鼠标系列 - vscode 搜索 自定义快捷键 F1 搜索 Alt+Shift+回车 跳转到搜索列表 选好后回车进入文件 F1的设置可能在其他贴子了 最新特大好消息 F4 是搜索完的跳转 等于F1 ...
- 写了一个 dict.cn 的油猴脚本,目的是通过url进行搜索。这样就能配合wox进行单词的搜索了。
写了一个 dict.cn 的油猴脚本,目的是通过url进行搜索.这样就能配合wox进行单词的搜索了. // ==UserScript== // @name dict.cn // @namespace ...