从 WPF 中的 ViewModel 类(MVVM 模式)更新 UI

2023-11-22

我在我的第一个 WPF 应用程序中使用 MVVM 模式,并且我认为有一些非常基本的问题。

当用户点击我的视图上的“保存”按钮时,将执行一个命令,该命令调用我的 ViewModel 中的 private void Save() 。

问题是“Save()”中的代码需要一些时间来执行,所以我想在执行大块代码之前隐藏 UI 视图中的“Save”按钮。

问题是,直到视图模型中的所有代码都执行完毕后,视图才会更新。 在执行 Save() 代码之前,如何强制视图重绘并处理 PropertyChanged 事件?

此外,我想要一种可重用的方式,这样我也可以轻松地在其他页面中执行相同的操作。其他人已经做了类似的事情吗? “正在加载...”消息?


如果需要很长时间,请考虑使用单独的线程,例如使用BackgroundWorker,以便 UI 线程在执行操作时可以保持响应(即更新 UI)。

In your Save方法,你会

  • 更改 UI(即修改一些 INotifyPropertyChanged 或 DependencyPropertyIsBusySaving绑定到您的 UI 的布尔值,隐藏“保存”按钮,并且可能显示一些进度条IsIndeterminate = True) and
  • start a BackgroundWorker.

In the DoWork您的BackgroundWorker 的事件处理程序,您执行冗长的保存操作。

In the RunWorkerCompleted事件处理程序,在 UI 线程中执行,您设置IsBusySaving为 false 并可能更改 UI 中的其他内容以表明您已完成。

代码示例(未经测试):

BackgroundWorker bwSave;
DependencyProperty IsBusySavingProperty = ...;

private MyViewModel() {
    bwSave = new BackgroundWorker();

    bwSave.DoWork += (sender, args) => {
        // do your lengthy save stuff here -- this happens in a separate thread
    }

    bwSave.RunWorkerCompleted += (sender, args) => {
        IsBusySaving = false;
        if (args.Error != null)  // if an exception occurred during DoWork,
            MessageBox.Show(args.Error.ToString());  // do your error handling here
    }
}

private void Save() {
    if (IsBusySaving) {
        throw new Exception("Save in progress -- this should be prevented by the UI");
    }
    IsBusySaving = true;
    bwSave.RunWorkerAsync();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 WPF 中的 ViewModel 类(MVVM 模式)更新 UI 的相关文章

随机推荐

  • 当我打开检查元素时,谷歌地图未完全加载,它将起作用

    我在我的网站上集成了谷歌地图 但是当我打开时 检查元素地图将起作用 当我关闭时 地图将消失 请让我知道问题出在哪里 before 打开后检查元素 代码在这里
  • 两个关系的(De)标准化

    读过C J Date的Introduction to Database System或类似水平书籍的人应该不会对规范化和非规范化的定义有任何疑问 然而 记忆已经不再是以前的样子了 我发现自己经常看着一些设计 并说它没有标准化 尽管我找不到它
  • 从列表中删除空字符串

    我刚刚开始学习 Python 课程 我确实需要一些帮助 如果您回答这个问题 请记住我是新人 我必须编写一个程序 取某个列表 l 中所有元素的平均值 这本身就是一个非常简单的功能 问题是老师希望我们在求平均值之前删除列表中存在的任何空字符串
  • 检测宏参数是否是类型名

    在 C11 gnuC11 中 如果宏参数是或不是类型名称 或者至少宏可以区分整数常量表达式和类型名称 即 如果可以检测到参数不是其中之一 则可以假设它是另一个 define IS TYPENAME X Static assert IS TY
  • Android 中定期从服务器获取数据(轮询)

    我正在开发一个应用程序 我使用休息调用从服务器获取数据并将其添加到视图中 我正确地获得了所有初始数据 我使用 AsyncTask 来做这件事 现在我想定期 比如2分钟 从服务器获取新数据并将其添加到视图中 在Android中定期从服务器获取
  • 如何将字典的键值对打印为对齐表?

    Student Name Mathematics 90 Computer Science 100 Chemistry 90 Physics 97 English 95 for key value in Student Name items
  • Angular 5 生产构建抛出错误

    我有一个使用版本 5 2 的角度应用程序 在构建生产时抛出以下错误 在本地运行应用程序或运行标准构建时不会抛出错误 必须指定路由或分析模块中的错误 经过研究 错误是由提前编译器抛出的 但我不确定是什么原因导致的 如果有人提出在哪里查看的建议
  • 如何在 Chrome 中分析网络工作者?

    有谁知道在 Chrome 中分析网络工作者的简单方法吗 我发现这个问题从去年开始 但不幸的是 唯一提供的答案不起作用 有什么办法可以做到这一点还是我只是看起来不好看 如果您甚至无法进行分析 这似乎是一个相当大的疏忽 会阻碍 Web 开发 要
  • 根据文本框的输入动态显示/隐藏div

    我正在一个网站上工作 我有一个页面 其中包含这样构建的人员列表 div class personsMenu div class person div class name John div div class age 18 div div
  • Symfony2 错误:加载的类名和声明的类名之间大小写不匹配:

    我正在 Symfony2 上工作 我更新了我的项目composer phar update 现在 当我检查我的网站时app dev php我总是有这个错误 Case mismatch between loaded and declared
  • 在数组中找到一个对象?

    Swift 有类似的东西吗 findWhere在Underscore js 中 我有一个类型的结构数组T并想检查数组是否包含一个结构对象 其name财产等于Foo 尝试使用find and filter 但它们只适用于原始类型 例如Stri
  • 使用常规迭代器向后迭代,还是与反向迭代器作斗争?

    我最近了解了在 C 中使用反向迭代器的正确方法 特别是当您需要擦除迭代器时 看这个问题 and this one 这就是你应该这样做的方式 typedef std vector
  • 方案中定义表达式的类型

    简单地说 我的问题是Scheme中定义表达式的类型是什么 举个例子 define x 5 or define x lambda n n n 这对我来说有点混乱 有人可以帮忙吗 球拍内define是一种特殊形式而不是表达式 因此它本身没有值
  • 屏幕上的客户端矩形坐标

    如何获取窗口客户区相对于屏幕的坐标 我想过使用GetClientRect and ClientToScreen 另外 在浏览器窗口中是什么ClientRect 仅有矩形HTML其中显示的文档 或者它包括浏览器栏和弹出菜单 这可能会缩小尺寸H
  • Java - 从缓冲读取器(从套接字)读取正在暂停线程

    我有一个线程从缓冲读取器读取字符 从套接字创建 如下所示 inputStream new BufferedReader new InputStreamReader clientSock getInputStream 这段代码只能运行一次 例
  • Clojure 1.9 Windows 安装

    过去 我使用 clojure org 提供的 Windows 安装程序在我的各种 Windows 计算机上安装 clojure Clojure 1 9 已经发布几周了 但据我所知 仍然没有 Windows 安装程序或基于 Java 的通用安
  • 特定扩展名的 Directory.GetFiles

    有没有办法简化这个 linq 表达式 或者有更好的方法吗 Directory GetFiles dir SearchOption AllDirectories Where s gt s EndsWith jpg StringComparis
  • 尝试将图表、范围等插入到 Word 时,Excel 2010 VBA 中的复制/粘贴错误

    在研究这个错误时 我得出的结论是 它与剪贴板没有像应有的那样清除有关 这在我们使用 2003 时不是问题 但现在我们使用 2010 我也继承了这段代码来自不再在这里工作的人 运行时错误 4605 此方法或属性不可用 因为剪贴板为空或无效 这
  • SockJS Python 客户端

    我有一个依赖 Websockets 的网站 Java Spring 践踏 Websocket对于 Spring RabbitMQ SockJS 的某些功能 我们正在创建一个基于 Python 的命令行界面 我们希望添加一些使用 websoc
  • 从 WPF 中的 ViewModel 类(MVVM 模式)更新 UI

    我在我的第一个 WPF 应用程序中使用 MVVM 模式 并且我认为有一些非常基本的问题 当用户点击我的视图上的 保存 按钮时 将执行一个命令 该命令调用我的 ViewModel 中的 private void Save 问题是 Save 中