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

10 篇文章 0 订阅

最近做一个爬取数据的项目,用户操作过程中需要将爬取的数据绑定显示在看板上作为数据预览。

功能上线后测试发现会偶发UI卡死崩溃问题,查日志报错:某个ItemsControl与它的项源不一致 计数器XXXXXX

先说下我的数据显示的实现方式:

主窗体放置了一个DataGrid(wpf原生控件) 然后xaml里添加

ItemsSource="{Binding Path=DataGridModel.DymTable.DefaultView, IsAsync=True, UpdateSourceTrigger=PropertyChanged}"

从而直接绑定viewmodel中的DataTable(数据表)

由于之前测试发现改变DataTable(表格A)之后 表格可能不随之更新(比如增加删除列)于是额外增加一个DataTable(表格B) 用于实际数据操作 然后数据操作结束后 进行 表格A=表格B 以此触发WPF数据的绑定更新。

问题:RT有时候增加列到一定数据量 (超出当前表格显示范围 产生水平滚动条) 然后再生成一列数据时(行数增加),UI直接崩溃。找了很久 发现网上都是说啥使用ObservableCollection代替List 进行数据绑定 但是我使用的是DataTable进行绑定的 不想换成这种方式(主要是我的数据都是按列生成 而不是按行生成)

最后查找StackOverflow才找到解决方式(老外就是牛逼 啥问题都有解决方法)

即:

myListBox.Items.Refresh();

就是每次赋值数据源前 先刷新一下控件的items 已避免计数出现问题 具体原理不知

public void Refresh()
        {
            this.Dispatcher.Invoke(() => {
                this.StaffAdminView.Items.Refresh();
                this.dg_CaptureTable.Items.Refresh();
            });
        }

界面后台增加一个刷新函数,然后viewmodel更新数据源时 先调用一下该函数(可通过回调实现) 修改之后多次测试 暂未复现UI崩溃问题

附上原文链接c# - An ItemsControl is inconsistent with its items source - WPF Listbox - Stack Overflowhttps://stackoverflow.com/questions/22524569/an-itemscontrol-is-inconsistent-with-its-items-source-wpf-listbox

纠正几点:

1.后面调整DataGrid Refresh的位置,在每次绑定新DataTable之后刷新控件

2.我之前出现问题的地方可能跟动态调整列宽,或者显示水平滚动条以及控制滚动条滚到最后一列有关系。后面绑定刷新完数据后再执行滚动条滚动命令,没有再次遇到报错

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
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 中的数据,使应用程序更加灵活和易于维护。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值