gpt4 book ai didi

wpf - 线程和 WPF 的绑定(bind)

转载 作者:行者123 更新时间:2023-12-02 17:49:33 27 4
gpt4 key购买 nike

情况

我的应用程序出现以下不稳定的行为:大约 20 次执行中有一次,绑定(bind)到 DataTable 的 WPFToolkit 的 DataGrid 不会呈现所有行,缺少预期的全部 4 行中 1 到 3 行之间的任何内容。

内部工作原理

  • DataGrid 绑定(bind)到 DataTableD1,它是自定义类 C1 的属性>。
  • 当用户激发 View 时,我们必须从后端检索数据,这可能需要时间。为此,我们创建一个线程(实际上,我们使用 BackgroundWorker 来执行此操作,但使用其中之一似乎没有区别),它运行一个方法 M1,打开连接并请求数据。该线程用于避免应用程序无响应。
  • M1 首先检索数据并将其存储在 DTO 上。之后,他要求C1清理它的 table 。 C1 执行此操作(通过调用 D1.Clear())并引发 NotifyPropertyChanged()(从线程)。
  • M1 将新后端的 DataTable 传递给 C1,后者将逐行插入到 D1 中。插入行完成后,C1 引发 NotifyPropertyChanged()。线程退出。

所以,换句话说,我清除表,通知 WPF,插入数据,通知 WPF 然后退出。

在我看来,只要从 UI 中正确使用最后一个 Notify,它就应该始终 显示所有行。

除了DataTable之外,还有大量属性(主要是字符串和整数)正在更新并因此得到通知。我们在任何其他情况下没有观察到这种行为,仅在 DataTable 中观察到此行为。

我知道这深入到了 WPF 的绑定(bind)机制,但我希望任何人都可以在这里阐明。欢迎任何有关 WPF 绑定(bind)或多线程与 WPF 的信息。

最佳答案

DataTable早于 WPF,因此未实现 INotifyCollectionChanged这就是 WPF 监视集合更改的方式。您有两个选择:

  1. 用新的 DataTable 替换现有的 DataTable(在设置行之后)。然后触发属性更改通知。
  2. 从 DataTable 更改为 ObservableCollection。每当您更改项目列表时,集合都会发出更改通知。 (请注意,如果您更改列表中已有项目之一的内容,它不会触发)

INotifyPropertyChanged 在属性发生更改时发出通知,而不是在内部状态(无论是属性还是集合)发生更改时发出通知。当您触发 Property Changed 事件时,如果属性与上次绑定(bind)数据时的对象不同,WPF 只会重新绑定(bind)控件。当您仅更改对象图中几层的一个属性时,这可以防止刷新整个屏幕。

关于wpf - 线程和 WPF 的绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8104532/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com