确保在 MVVM WPF 应用程序中的 UI 线程上调用 OnPropertyChanged()

2024-01-08

在我使用 MVVM 模式编写的 WPF 应用程序中,我有一个后台进程来做这件事,但需要从它获取状态更新到 UI。

我使用的是 MVVM 模式,因此我的 ViewModel 实际上对向用户呈现模型的视图 (UI) 一无所知。

假设我的 ViewModel 中有以下方法:

public void backgroundWorker_ReportProgress(object sender, ReportProgressArgs e)
{
    this.Messages.Add(e.Message);
    OnPropertyChanged("Messages");
}

在我看来,我有一个绑定到 Messages 属性的 ListBox(List<string>)的视图模型。OnPropertyChanged履行的角色INotifyPropertyChanged接口通过调用PropertyChangedEventHandler.

我需要确保OnPropertyChanged在 UI 线程上调用 - 我该如何执行此操作?我尝试过以下方法:

public Dispatcher Dispatcher { get; set; }
public MyViewModel()
{ 
    this.Dispatcher = Dispatcher.CurrentDispatcher;
}

然后将以下内容添加到OnPropertyChanged method:

if (this.Dispatcher != Dispatcher.CurrentDispatcher)
{
    this.Dispatcher.Invoke(DispatcherPriority.Normal, new ThreadStart(delegate
    {
        OnPropertyChanged(propertyName);
    }));
    return;
}

但这没有用。有任何想法吗?


WPF 自动将属性更改封送到 UI 线程。但是,它不会封送集合更改,因此我怀疑您添加消息导致了失败。

您可以自己手动编组添加(请参见下面的示例),或者使用类似的东西这项技术 http://kentb.blogspot.com/2008/01/cross-thread-collection-binding-in-wpf.html我不久前写过博客。

手动编组:

public void backgroundWorker_ReportProgress(object sender, ReportProgressArgs e)
{
    Dispatcher.Invoke(new Action<string>(AddMessage), e.Message);
    OnPropertyChanged("Messages");
}

private void AddMessage(string message)
{
    Dispatcher.VerifyAccess();
    Messages.Add(message);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

确保在 MVVM WPF 应用程序中的 UI 线程上调用 OnPropertyChanged() 的相关文章

  • WebClient读取错误页面的内容

    我有一个加载页面内容的应用程序 我使用 WebClient 类 即使服务器返回 404 500 等错误 我也需要检索内容 我需要这样的东西 WebClient wc new WebClient string pageContent try
  • 如何将字节块读入结构体

    我有一个需要处理的资源文件 它包含一组文件 首先 资源文件列出了其中包含的所有文件 以及一些其他数据 例如在此结构中 struct FileEntry byte Value1 char Filename 12 byte Value2 byt
  • 使用多线程并行化 Java 中的 for 循环

    我对java很陌生 我想使用执行器服务或使用java中的任何其他方法并行化嵌套for循环 我想创建一些固定数量的线程 这样CPU就不会完全被线程占用 for SellerNames sellerNames sellerDataList fo
  • Linux/POSIX:为什么 fork() 不分叉*所有*线程

    众所周知 POSIX下创建新进程的默认方式是使用fork 在 Linux 下 这在内部映射到clone 我想知道的是 众所周知 当一个人打电话时fork 子进程是用单个线程创建的 调用的线程fork cf https linux die n
  • 无法获取托管类型(“T”)的地址、获取其大小或声明指向托管类型的指针

    为什么哦为什么这是不允许的 private static unsafe byte ConvertStruct
  • 如何处理来自单独线程的窗口消息?

    我希望启动一个单独的线程来处理窗口消息 通过阻塞 GetMessage 循环 但之后仍然在初始线程中创建窗口 在单独的线程中 一旦启动 我就会调用PeekMessage使用 PM NOREMOVE 确保消息队列存在 有必要吗 然后 Atta
  • C# 7 表达式主体构造函数

    在 C 7 中 如何使用 2 个参数编写这样的表达式主体构造函数 public Person string name int age Name name Age age 一种方法是使用元组和解构来允许在一个表达式中进行多次赋值 public
  • .NET 中严格浮点数学的库

    我有 Java 算法 计算及其单元测试 单元测试期望结果具有一定的精度 增量 现在我将算法移植到 NET 中 并希望使用相同的单元测试 我使用双数据类型 问题在于 Java 使用 strictfp 64 位 来执行 Math 类中的某些操作
  • 列表框未使用绑定填充

    我正在尝试使用 mvvm 模式将现有程序转换为 c wpf 第一部分是选择要处理的文件的文件夹位置并填充列表框 我在这里找到了一个使用 Mvvm Light 的示例 WPF OpenFileDialog 与 MVVM 模式 https st
  • 比较和交换的工作原理

    我读过很多帖子说比较和交换保证原子性 但是我仍然不明白它是如何做到的 这是比较和交换的通用伪代码 int CAS int ptr int oldvalue int newvalue int temp ptr if ptr oldvalue
  • C#:询问用户密码,然后将其存储在 SecureString 中

    在我目前为客户开发的小型应用程序中 我需要询问用户他的 Windows 登录用户名 密码和域 然后使用这些信息系统 诊断 进程 启动启动一个应用程序 我有一个带有 UseSystemPasswordChar 的文本框来屏蔽输入的密码 我需要
  • WPFToolkit.Extended - 工具在哪里?

    我已采取的步骤 我正在使用 NET 4 0 我得codeplex http wpftoolkit codeplex com releases view 84227并下载了第一个 扩展 WPF 工具包二进制文件 2 号将此文件 Extende
  • string.Empty 与 null。您使用哪一个?

    最近工作的同事告诉我不要使用string Empty设置字符串变量时但使用null因为它污染了堆栈 他说不做 string myString string Empty but do string mystring null 真的有关系吗 我
  • 如何获取可用系统内存的大小?

    C NET 中是否可以获取系统可用内存的大小 如果是的话怎么办 Use Microsoft VisualBasic Devices ComputerInfo TotalPhysicalMemory http msdn microsoft c
  • 使用 std::packaged_task/std::exception_ptr 时,线程清理程序报告数据争用

    我遇到了线程清理程序 TSan 的一些问题 抱怨某些生产代码中的数据争用 其中 std packaged task 通过将它们包装在 std function 中而移交给调度程序线程 对于这个问题 我简化了它在生产中的作用 同时触发 TSa
  • 计算 Richtextbox 中所有单词的最有效方法是什么?

    我正在编写一个文本编辑器 需要提供实时字数统计 现在我正在使用这个扩展方法 public static int WordCount this string s s s TrimEnd if String IsNullOrEmpty s re
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • Android 中的处理程序与异步调用

    目前我正在使用处理程序来调用 Web 服务方法以使其在后台运行 问题是它需要更多的时间来给出响应 在性能方面似乎更昂贵 现在我计划使用异步调用 哪一个是最好的 Android 中的处理程序和异步调用有什么区别 请帮我想出一个最好的解决方案
  • WPF - 关闭 App.g.cs 中 Main 的自动生成

    我正在学习WPF 我想在 App xaml cs 中提供我自己的 Main 方法 而不是在 App g cs 中为我生成一个方法 然而 我不断遇到冲突 因为我还没有找到如何阻止生成额外的 Main 我的项目文件或其他地方是否有控制此设置的设
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装

随机推荐

  • Oracle JDK 和 OpenJDK 之间的区别

    注意 这个问题来自 2014 年 从 Java 11 OpenJDK 和 Oracle 开始 JDK 正在趋同 Oracle 和 OpenJDK 之间有什么重要区别吗 例如 垃圾收集和其他 JVM 参数是否相同 两者之间的 GC 工作方式是
  • 变量周围的大括号

    我正在尝试理解这段代码 我什至不知道它的语法是否正确 我猜是练习的一部分 records 大括号表示什么 我见过同样的情况 但有一个 使用运算符代替 如果这有影响的话 多谢你们 The perlref 文档的 使用引用 部分 http pe
  • 等待递归线程生产者

    我有一个收集器 用于搜索游戏中的动作 我以递归搜索的方式进行搜索 以获取游戏中每一个可能的动作 出于性能原因 我使用线程池 每个找到的移动都会向池中添加一个新线程 以扩展旧的移动 这是一些代码 protected static List
  • em 是如何计算的?

    我注意到你可以使用 1em 并且它在不同的网站上看起来会有所不同 em 与什么成比例 使用的字体 最大的字体大小 页面宽度 高度 See http w3schools com cssref css units asp http w3scho
  • 更改 R 类包 android/eclipse

    我正在android中的一个小界面上工作 当我运行它时 出现 xxx应用程序已意外停止 我正在寻找可能的错误 但什么也没找到 无论如何 我想更改R类包名称 当我重构 gt 重命名它时 eclipse会在旧包中生成另一个包 即使我删除该包ec
  • 为什么我们应该在 PHP 中使用静态调用?

    为什么我们要在 PHP5 中使用静态变量或静态调用静态方法 也许是为了提高性能 我们使用静态类变量在类的所有实例之间共享数据 并且我们使用静态方法 最好是private static 来计算类功能所需的东西 但独立于类实例状态 this 性
  • 使用 cmake 将 clr 支持设置为 true

    我正在尝试使用 cmake 生成托管 C 代码 下面是我添加的脚本 SET TARGET PROPERTIES PROJECT NAME PROPERTIES COMPILE FLAGS clr STRING REPLACE EHsc EH
  • 如何将 SQL 连接字符串与 ADO.NET 实体数据模型结合使用

    我正在尝试以一种可以即时更改我指向的数据库的方式使用 ADO NET 实体数据模型 更改数据库可能需要全新的连接字符串 有些数据库位于不同的服务器上 因此 我需要能够向 ADO NET 实体数据模型传递自定义连接字符串 格式如下 serve
  • Jenkins 不从文件输出 Junit 报告信息

    Problem Jenkins 未选取 junit 格式的报告 导致报告未在项目的状态屏幕中列出 Details junit 格式的报告数据由名为 Karma runner 以前称为 Testaulous 的测试框架生成 被忽略的文件创建于
  • 当代码移动到 Angular 组件时,Owl 轮播不起作用

    我的 Angular 版本 Angular 7 我刚刚开始学习 Angular 并尝试在我的 Angular 项目中使用下载的 Bootstrap 模板 我的owl carousel打开时效果很好index html在我的 Angular
  • 如何在 php 的 ssh2 函数中使用 pem 文件

    我需要通过 php 的 ssh2 函数连接到一些 Amazon EC2 实例以获取一些信息并将其显示在我的后台 ssh2 函数中是否有一种方法可以执行与通过命令行 ssh 连接时相同的操作 ssh i path to file key pe
  • 如何修复 mat-tab 的标题

    我有 5 个 mat tab 每个选项卡都有大量数据 因此滚动将添加到该窗口 有什么方法可以修复 mat tab 的标题并让内容可以滚动 我尝试放置位置 固定 位置 粘在里面 ng deep mat tab label 但这似乎并不能解决问
  • 带有 ObjectDatasource UpdateMethod 的 GridView

    我有一个 ASP NET WebForms 页面 其中包含ASPxGridView and an ObjectDataSource
  • Java 8 https 连接在某些站点上失败

    我无法访问某些 https 资源 请帮助使 https 调用可靠 我在这里放置的示例是通过 Firefox 浏览器进行测试的 以确保它们正常工作 java version openjdk version 1 8 0 121 OpenJDK
  • 微任务是否保证在它们排队的同一动画帧内触发?

    例如 Promise 使用微任务 我验证了here https mail mozilla org pipermail es discuss 2016 April 045905 html它们可以在动画帧结束之前完成 在 Chrome 中 我说
  • JSP中如何获取浏览器信息?

    如何使用 JSP 获取客户端 IP 和浏览器信息 以下 jsp 将输出您的 IP 地址和用户代理 Your user agent is br Your IP address is br 要找出用户正在使用的浏览器和 或操作系统 请解析用户代
  • 在python中简单编辑二进制文件

    这应该很容易 但我一直无法找到这个问题的答案 使用python 我想将二进制文件读入内存 修改文件的前四个字节 然后将文件写回 必须有一种简单的方法来编辑四个微不足道的字节 正确的 为什么读取整个文件要改变开头的四个字节 这不应该起作用吗
  • 如何让重音字母在 bash 上真正起作用?

    我在 cygwin 上安装的 bash 无法正确处理重音字母 我尝试添加 set input meta on to accept 8 bit characters set output meta on to show 8 bit chara
  • 仅读取文件的下一行一次

    我有一个应用程序 它从文本文件中读取信息 然后对它们进行分类并将它们放入数据库中 对于一个类别 我需要检查当前行之后的行并查找某个关键字 我如何阅读这一行 当流阅读器当前行已打开时 应该会发生这种情况 我在 VS2010 上使用 C Edi
  • 确保在 MVVM WPF 应用程序中的 UI 线程上调用 OnPropertyChanged()

    在我使用 MVVM 模式编写的 WPF 应用程序中 我有一个后台进程来做这件事 但需要从它获取状态更新到 UI 我使用的是 MVVM 模式 因此我的 ViewModel 实际上对向用户呈现模型的视图 UI 一无所知 假设我的 ViewMod