【问题标题】:Why is WPD Datagrid Usercontrol bound to row datacontext not updating?为什么 WPF Datagrid Usercontrol 绑定到行数据上下文不更新?
【发布时间】:2020-02-21 07:40:15
【问题描述】:

我有一个 DataGrid 通过 ListCollectionView 绑定到类型为 Job 的 ObservableCollection 对象,比如说。 DataGrid 中的每个单元格都包含一个 UserControl,该 UserControl 具有一个名为 Job 的依赖属性,该属性绑定到 DataGridRow.DataContext(使用 Mode=TwoWay)。一切都正确显示。

问题是我有一个后台进程,它会改变 Job 对象引用的对象以及由 UserControl 显示的对象。显然,乔布斯没有改变,所以观点也没有改变。 如何让每个单元格中的用户控件使用新数据更新自己?

【问题讨论】:

    标签: c# wpf datagrid user-controls


    【解决方案1】:

    对于列表,您需要注意 3 种 ChangeNotification:

    • 作业类的每个属性。
    • 如果从集合中添加或删除元素,则返回该元素。这是 ObservableCollection 唯一需要处理的部分。
    • 属性上的一个公开列表/CollectionView/whatever。 ObservableCollection 缺少 AddRange 函数,因此在进行大型操作(如列表的重建)时,它会向 UI 发送垃圾邮件。解决方案是在后台构建一个新列表,然后在此属性中公开它。

    如果是多线程,一个特殊的问题也可能是后台进程。 GUI 是protected against being written from the wrong Thread。但众所周知,线程擅长吞咽异常。通常你需要写一个错误的 Catch,但他们是免费的。因此,您可能会运行 int oa CrossThread 异常而从未注意到它。

    为了得到更好的答案,我们需要一些实际的代码。比如作业类、BackgroundProcess 等。

    【讨论】:

    • 后台线程使用 Dispatcher.BeginInvoke 更新 UI 数据对象。我认为问题在于用户控件只有 Job 绑定并且这不会改变。我将尝试向 Job 对象添加另一个名为修订号的属性,并将其绑定到用户控件上的新 Dependency 属性。然后更新程序可以增加修订号,这应该会触发用户控件中的属性更改,然后可以更新自己。当我有结果时,我会在这里重新发布。
    • @PeterWilson 3 种绑定形式怎么样?为什么不向我们展示代码?我是否没看错,您在 ViewModel 中使用了 DependencyProperties?
    • 我上面概述的技术有效。但是,我们在后台更新程序中遇到了多个问题:1. 海量服务器命中,2. 内存泄漏,3. SQL 死锁。我们决定回到一个简单的刷新按钮。这也解决了我们刷新整个网格时的问题。
    • @PeterWilson:对于 2,人们经常误读内存数据或误解 GC 的工作原理:stackoverflow.com/a/58486473/3346583 |如果不向我们展示查询,我们将无能为力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 2011-02-25
    • 1970-01-01
    • 2013-06-01
    相关资源
    最近更新 更多