gpt4 book ai didi

WPF MVVM 在后台工作人员上更新 View 模型

转载 作者:行者123 更新时间:2023-12-04 11:44:03 24 4
gpt4 key购买 nike

这个 senerio 有效吗?

我有一个 View 来维护一个项目。

我有 View 模型,它将项目对象(实现 INotifyPropertyChanged)公开为 View 绑定(bind)到的属性。

我是否可以将 Item 对象传递给对其进行修改的 Backgroundworker,然后在 BackgroundWorking 完成时引发 PropertyChanged 事件?

或者 BackgroundWorker 不应该修改 Item 对象。我将使用 BackgroundWorker 传回的结果更新现有的 Item 对象。这将在 RunWorkerCompleted 事件中完成。但这是否会锁定 UI 线程并破坏拥有后台工作人员的对象?

使困惑?

我会尽力解释。

用户可以选择创建一个项目。我创建 View 和 View 模型。在 View 模型中创建了一个空的 Item 对象。为他提供了一个 View 来维护该项目。在选择项目类型属性时,这会引发一个复杂的过程来创建要由用户输入的属性列表。我可以在创建列表时阻止 UI 线程,但这会带来糟糕的用户体验。我想将处理传递给后台线程,同时保持 UI 处于事件状态。目前,我设置了一个标志来指示 View 上的部分正在加载,将 Item 对象传递给 BackgroundWorker,后者会更新可观察的 Properties 集合。当 BackgroundWorking 完成时,我调用 PropertyChanged 事件,该事件更新绑定(bind)到列表的 View 部分并关闭标志以指示该部分正在加载。这似乎没有问题。但我有一种直觉,我不应该在后台线程中更新来自 View 模型的绑定(bind)对象。

谢谢蒂姆

最佳答案

这听起来不错。只要您的项目对象是 没有 DependencyObject ,您可以在后台工作人员中更改它们的属性。
对对象属性的数据绑定(bind)将起作用,绑定(bind)引擎将为您自动进行线程切换。
但是,不要在没有调度操作的情况下填充数据绑定(bind)集合或在后台工作人员中操作 DependencyObjects(例如 UI-Controls)的属性。这将导致异常。

编辑:
仅用于澄清:真正的问题不是,如果 item-object 是 DependencyObject但如果属性是 CLR-propertyDependencyProperty .因为 DependencyProperties 绑定(bind)到 DependencyObjects,所以我经常使用上面的简化,但这并不是全部事实。
这意味着如果你有一个 CLR 属性,你可以从一个外部线程设置它的值,不管你的类是 DepenendencyObject。或不。这与我的第一个陈述略有不同。

关于WPF MVVM 在后台工作人员上更新 View 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5196257/

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