【发布时间】:2011-12-27 14:52:01
【问题描述】:
情况
我的应用程序出现以下不稳定行为:大约 20 次执行中的一次,绑定到 DataTable 的 WPFToolkit 的 DataGrid 不会呈现所有行,缺少 1 到 3 之间的任何内容预期的整 4 行。
内部运作
-
DataGrid绑定到DataTableD1,这是自定义类 C1 的属性。 - 当用户刺激视图时,我们必须从后端检索数据,这可能需要一些时间。为此,我们创建了一个线程(实际上,我们使用
BackgroundWorker,但似乎与使用其中一个没有区别),它运行一个方法,M1,打开连接并请求数据。该线程用于避免应用程序无响应。 - M1 首先检索数据并将其存储在 DTO 上。之后,他要求 C1 清理它的桌子。 C1 这样做(通过调用
D1.Clear())并引发NotifyPropertyChanged()(来自线程)。 - M1 将新后端的
DataTable传递给C1,后者将逐行插入D1。完成插入行后,C1 引发NotifyPropertyChanged()。线程退出。
也就是说,我清表,通知WPF,插入数据,通知WPF,然后退出。
在我看来,只要从 UI 正确使用最后一个通知,它就应该始终显示所有行。
除了DataTable,还有大量属性(主要是字符串和int)正在更新并因此得到通知。我们没有在任何其他情况下观察到这种行为,只有DataTable。
我知道这深入到 WPF 绑定机制中,但我希望任何人都可以在这里阐明。欢迎任何关于 WPF 绑定或 WPF 多线程的信息。
【问题讨论】:
-
当 M1 要求 C1 对 D1 进行更改时,您是否正在调度到 UI 线程?
-
@KentBoogaart:不!更改是在线程本身中进行的。但是,在进行更改后,C1 会引发 NotifyPropertyChanged。我相信这应该足以保证 UI 将使用正确的内容进行刷新。是真的吗?
标签: wpf multithreading wpftoolkit