我让我的应用程序下面的见异思迁的行为:在约20处决一,这势必给DataTable
一个WPFToolkit的DataGrid
不会使所有行,在预期的整个4行之间缺少1到3之间的任何东西。
内部工作
- 的
DataGrid
绑定到DataTable
,D1,它是一个自定义的类的属性,C1。 - 当用户激活视图时,我们必须从后端检索数据,这可能需要时间。为此,我们创建一个线程(实际上,我们使用
BackgroundWorker
来表示,但似乎与使用其中一个没有什么区别),它运行一个方法,即打开连接并请求数据的方法,即M1。该线程用于避免出现无响应的应用程序。 - M1首先检索数据并将其存储在DTO中。之后,他要求C1清除它的表格。 C1这样做(通过调用
D1.Clear()
)并提出NotifyPropertyChanged()
(来自线程)。 - M1将新后端的
DataTable
传递给C1,它将行逐行插入D1。插完行后,C1增加NotifyPropertyChanged()
。线程退出。
所以,换句话说,我清理表格,通知WPF,插入数据,通知WPF并退出。
在我看来,只要最后一次Notify从UI正确使用,就应该总是显示所有行。
除了DataTable
之外,还有大量属性(主要是字符串和整数)被更新并通知。我们有而不是在任何其他情况下观察到此行为,只能使用DataTable
。
我知道这很深入到WPF机制的绑定,但我希望任何人都可以在这里阐明。 任何欢迎使用WPF绑定或使用WPF多线程的信息。
当M1要求C1对D1进行更改时,是否调度到UI线程? –
@KentBoogaart:不!这些更改是在线程本身中进行的。但是,更改完成后,C1会引发NotifyPropertyChanged。我相信这应该足以保证使用正确的内容刷新UI。这是真的吗? –