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命令将手机界面操作演示存为视 ...
随机推荐
- mantis如何更改用户密码
从MantisBT版本开始,创建用户后,必须由用户通过确认邮件进行修改密码,而管理员无权对用户的密码进行修改.这对于配置mail不成功的情况下很不方便. 以下配置就可以让管理员轻松管理用户的密 ...
- 华为OD请己经入职的人出来谈谈你的真实感受?
修改了一下回答的排版,之前只要更新就在最前面, 现在按照会见顺序重新整理了一下. 部门捞人 上海 深圳 西安 东莞 办公地 武汉南京现在也有 通道:点击通道2字 写在前面 总结一下我的体验其实挺好的, ...
- 【笔记】css —— BFC 原理
一.什么是 BFC BFC 即 Block Formatting Contexts (块级格式化上下文),具有 BFC 特性的元素可以看作是隔离了的独立容器,容器里面的元素不会在布局上影响到外面的元素 ...
- python selenium list index out of range
常见错误原因 常见错误原因 其他错误原因 场景 使用selenium循环打开并跳转到新的网页,然后关闭新的窗口,然后回到原来窗口,这时候获取list中的值,报错: list index out of ...
- XILINX SDK烧录FLASH报错不支持旧版hw_server
最近频繁遇到SDK报错,说是不支持hw_server旧版本,此时打开vivado识别的时候也是一样报错,可能原因是我电脑安装了多个版本的VIVADO导致的,那么怎么解决呢? 打开任务管理器,kill ...
- 【Azure Cloud Service】云服务升级后,查看配置文件发现编码变为utf-16
问题描述 通过Migrate to ARM,把经典云服务升级成云服务(外延支持)后,在查看云服务的配置XML文件,发现文件的编码格式由 UTF-8 改变为 UTF-16 由此,引发了三个问题 1)Cl ...
- 【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
问题描述 Azure Cache for Redis 服务在传输和存储数据时是如何加密呢? 问题回答 一:关于Azure cache for Redis服务在数据传输过程中是如何加密的? 为了确保在A ...
- NebulaGraph is nothing without you | 社区 2023 年度人物合集
在去年的年度人物 回顾中,我们看到了形形色色的人们,他们当中有帮 NebulaGraph 捉 bug 的小能手,也有通过用回复来解答他人疑惑的启蒙者-在今年(2023 年),我们这个整点不一样的,将镜 ...
- Codeforces Round 914 (Div. 2)A~C
A 反过来考虑,由皇后和国王的位置去寻找骑士的位置,当一个点既可以被皇后找到,也可以被国王找到时就说明这个点是满足条件的 #include <bits/stdc++.h> #define ...
- CYQ.Data 支持 KingbaseES人大金仓数据库
KingbaseES人大金仓数据库介绍: KingbaseES是一种关系型数据库管理系统,也被称为人大金仓数据库.KingbaseES 是北京人大金仓信息技术股份有限公司研发的,具有自主知识产权的通用 ...