WPF 某个ItemsControl与它的项源不一致

问题描述

多线程模式下,同时更新同一个DataGrid (或其他控件)导致 “System.Windows.Controls.DataGrid Items.Count:n” 的生成器已接收到一个 CollectionChanged 事件序列,这些事件与 Items 集合的当前状态不符。  检测到以下差异:
累积计数 n 与实际计数 m 不相同。[累积计数的计算方式为: 上次重置时的计数 + 添加数 - 自上次重置后的删除数。

解决方案

使用系统的UI调度来添加参数:

//而且如果要执行这个Add操作,集合必须要求是 ObservableCollection<T> 类型的。
Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action<MyModel>((x) =>{ YourList.Add(x); }), param);


问题分析

上述问题,对UI已绑定的集合进行Add操作需要上述操作,才能避免该问题;

但如果是直接赋值,也可避免该异常出现。可直接赋值,例如:

YourList = new List<T>();

我个人理解是控件默认的添加数据方式并不是一个安全的原子操作,需要使用同一个调度来执行方可避免计数冲突;

参考:

https://stackoverflow.com/questions/2505492/wpf-update-binding-in-a-background-thread

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF Prism 是一个用于开发 WPF 应用程序的框架,它提供了一些基本的工具和模板,使开发者能够更加轻松地构建模块化的、可扩展的应用程序。其中,ItemsControl 是一个非常重要的控件,它可以用来显示一个集合中的数据,而 Prism 则提供了一些很好的方式来管理这些数据。 在 Prism 中,使用 ItemsControl 通常需要先定义一个数据模板,然后将该模板与 ItemsControl 关联。这可以通过在 XAML 中添加以下代码来实现: ```xml <ItemsControl ItemsSource="{Binding MyItems}"> <ItemsControl.ItemTemplate> <DataTemplate> <!-- Define the look of each item here --> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> ``` 其中,`MyItems` 是一个绑定到 ViewModel 中的集合,DataTemplate 则定义了每个集合项的外观。通过这种方式,我们可以非常方便地将数据显示在界面上。 除此之外,Prism 还提供了一些有用的功能来处理 ItemsControl 中的数据。例如,我们可以使用 `ICollectionView` 接口来对数据进行排序、过滤等操作。具体方法如下: ```csharp // 获取集合视图 ICollectionView view = CollectionViewSource.GetDefaultView(MyItems); // 进行排序 view.SortDescriptions.Add(new SortDescription("PropertyName", ListSortDirection.Ascending)); // 进行过滤 view.Filter = item => ((MyItem)item).Name.StartsWith("A"); ``` 另外,Prism 还提供了一些有用的扩展方法来处理 ItemsControl 中的数据。例如,`SelectedItem` 扩展属性可以用来获取或设置当前选中项,而 `SelectedItems` 扩展属性则可以用来获取所有选中项的集合。具体方法如下: ```xml <ItemsControl ItemsSource="{Binding MyItems}" prism:SelectedItem.SelectedItem="{Binding SelectedItem}"> <ItemsControl.ItemTemplate> <DataTemplate> <!-- Define the look of each item here --> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> ``` 通过这种方式,我们可以轻松地处理 ItemsControl 中的数据,使应用程序更加灵活和易于维护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值