如何与多个 ViewModel 共享多个 ObservableCollections?

2024-04-26

我正在编写一个有 4 个视图的程序:公司视图, 会员查看, 周视图 and 报告查看。每个都有对应的ViewModel和Model。我使用 PRISM BindableBase 来创建 ViewModel。数据绑定正确。

  • 公司视图模型包含一个对象类型Company.
  • 成员视图模型包含一个 ObservableCollectionMember对象。
  • 周视图模型包含一个 ObservableCollectionWeek对象。

通过主窗口中的顶部按钮执行导航,可以随时选择任何视图.

Container.RegisterTypeForNavigation<CompanyView>("CompanyView");
Container.RegisterTypeForNavigation<MembersView>("MembersView");
Container.RegisterTypeForNavigation<WeeksView>("WeeksView");
Container.RegisterTypeForNavigation<ReportsView>("ReportsView");

问题是周视图模型 must also可以访问ObservableCollection 成员。还有报告视图模型 must also可以访问Company Object, ObservableCollection 成员周可观察集合.

我不知道如何实现这一点。如何轻松地在 ViewModel 之间共享数据?

我尝试过使用PRISM IEventAggregator发布可观察集合当它们更新时,这可以工作,但是必须首先访问视图,然后才能侦听事件。如果用户之前没有单击过“周”视图,则更新后的会员收藏达不到周视图。我可以预先初始化视图吗?我该怎么做?

我跟着Prism 让 MVVM 变得简单 - 网络研讨会 (https://www.youtube.com/watch?v=ZfBy2nfykqY https://www.youtube.com/watch?v=ZfBy2nfykqY)并发现评论中写的同样的问题。 Brian Lagunas 建议解决此问题的唯一方法是通过导航参数:

我在 UpdateEvent 将消息从 ViewAViewModel 传递到 ViewBViewModel 时遇到了一个小问题。如果我没有访问过 ViewB,它似乎不起作用,我认为这是因为 ViewBViewModel 尚未实例化,直到它的视图至少加载一次。

任何人对此有任何想法,我认为在需要之前实例化所有视图模型是一个坏主意,那么如何在实例化视图模型之前从其他视图模型获取默认信息?

Brian Lagunas:唯一的方法是在导航到 ViewBViewModel 时将该信息作为参数传递。

我考虑过使用导航参数,但似乎您必须知道从哪里导航到哪里。例如。从会员查看 > 周视图,通过会员收藏作为参数。但用户可以按任何顺序导航,包括直接导航到周视图在程序加载时。例如如何周视图得到会员收藏如果他们来自公司视图?公司不了解会员收藏。

我对其他想法持开放态度,我进行了广泛的研究,但完全陷入困境:-(

非常感谢您的想法和帮助! 亲切的问候, 达米安


问题是 WeeksViewModel 还必须有权访问 Members ObservableCollection。 ReportsViewModel 还必须能够访问 Company 对象、Members ObservableCollection 和 Weeks ObservableCollection。

我不知道如何实现这一点。如何轻松地在 ViewModel 之间共享数据?

您可以使用单个视图模型,其中包含每个特定视图模型的属性以及要在两个或多个视图模型之间共享的公共属性,例如:

class MainViewModel
{
    public CompanyViewModel CompanyViewModel { get; set; }
    public MembersViewModel MembersViewModel { get; set; }
    public WeeksViewModel WeeksViewModel { get; set; }

    public ObservableCollection<Members> Members { get; set; }
}

然后每个子视图都可以继承DataContext父窗口的属性并绑定到他们想要的所有视图模型类型的任何属性。

另一种选择是使用直接引用、事件聚合器或共享服务在视图模型之间来回传递信息。

但是,如果视图模型仍然必须访问彼此的属性,那么拼命尝试分离视图模型之间的逻辑似乎毫无意义。所以我可能会采用第一种方法。

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

如何与多个 ViewModel 共享多个 ObservableCollections? 的相关文章

随机推荐

  • 无法更新 Android Studio 中的 JDK 位置

    我无法在 Android Studio 中更新 Java JDK 或 Android SDK 路径 要更新默认的 JDK 或 Android SDK 打开Android Studio 转到快速启动 gt 配置 gt 项目默认值 gt 项目结
  • 画布绘制文本定位

    我正在创建一个绘图工具 用户可以在其中向图像添加文本 当通过画布位置将文本绘制到位图时 未正确设置 Paint paint new Paint paint setStyle Paint Style FILL paint setColor C
  • 如何使用没有按钮的 jQuery UI 图标?

    jQuery UI 带有一些很好的图标 没有按钮我该如何使用它们 让我们说一下如何创建链接plus签名并通过更改图标对悬停和单击做出反应 Here http jsfiddle net and7ey gZQzt 是仅添加图标的演示 Upd 1
  • python 遍历文件中的行

    我见过这两种处理文件的方法 file open file txt for line in file do something file open file txt contents file read for line in content
  • 无与伦比的括号宏怪异

    根据 C99 规则预处理以下 3 行的正确输出是什么 define y x x define x a y a x 1 x 2 顺便说一句 linux 下的 cpp 会产生错误消息 但我不明白为什么答案不简单 1 2 假设 cpp 是正确的而
  • 以编程方式自动填充 UAC 详细信息

    有没有办法通过编程方式在 Visa 中自动填写 UAC 登录名和密码 例如 出现UAC提示 您的程序会自动为您填写该信息 例如 一个程序会在 UAC 提示符中使用管理员用户名和密码自动填充该信息 SendKeys 无法将输入键发送到 UAC
  • 如何在 Inno Setup 中为控件卷出设置动画

    我想在我的安装程序中制作控件滚动的动画 你可以看这个视频 https drive google com file d 1H0HKTPXg9BdYD4HQWqCWHlGSTIHlcJa view 您可以使用计时器来为控件设置动画 Code f
  • 知道axios中是否有待处理的请求

    我是 ReactJS 的新手 对于我的 ajax 调用 我尝试使用Axios https github com mzabriskie axios图书馆 太棒了 但现在我想知道是否有办法知道 axios 拦截器中是否有待处理的请求 因为我想显
  • 单击旁边的按钮时如何引用动态创建的标签 [Qt]

    每次按下 添加客户端 按钮时 减号按钮 客户端名称 客户端计数器和加号按钮都会以水平线添加到网格布局中 我想在按下加号 减号按钮时更新计数 QLabel 这是我的代码 include widget h include ui widget h
  • Flask-PyMongo collMod

    我正在尝试使用 PyMongo 更新 TTL 集合 试图运行这个我得到 失败没有这样的命令 索引 client db command collMod url index keyPattern dateCreated 1 expireAfte
  • 什么是二叉搜索树中的“内部节点”?

    我正在互联网上搜索 内部节点 一词的定义 我找不到简洁的定义 我正在查看的每个来源都使用该术语但没有定义它 并且这种用法并不能产生内部节点实际是什么的正确定义 这是我主要看的两个地方 Link https planetmath org Ex
  • Solr 中的多值字段排序

    我有一个 Solr 索引 将每个产品的价格存储在多值字段中 我需要按价格对结果集进行排序 其中价格从低到高 从高到低 我尝试对价格进行排序 它显示错误您无法对 multivalued True 字段进行排序 下面是我的 solr XML
  • Javadoc 错误 - java.lang.reflect.InitationTargetException

    我正在尝试从 yDoc 库生成 uml 图 它基本上使用 Javadoc 来解析 Java 源文件 但是 当我尝试从终端 OS X 执行命令时 出现以下错误 javadoc error In doclet class ydoc doclet
  • C++ - 通过添加字节整数来向前移动 char 指针是否合法/推荐?

    我正在寻找一些方法来将指针推进到压缩档案中的文件开头 我有一个指向已读入内存的文件开头的字符指针 归档目录包含每个文件的偏移量 是否合法 建议这样说 char beginning Imagine this is assigned to th
  • Azure API 管理:原始标头丢失或为空,并且请求被分类为非跨域。未应用 CORS 政策

    我正在使用 Azure API 管理 并且需要使用它来管理三个 API 测试时 GET 方法工作正常 但是 post 方法出现以下错误 原始标头丢失或为空 并且请求被归类为非跨域 未应用 CORS 政策 我进行了搜索并发现了一些 CORS
  • Apache Camel:如何存储变量以供以后使用

    在使用 Spring DSL 玩 Camel 时 我遇到了以下问题 假设预期的消息流如下所示 客户端将带有 XML 正文的 HTTP POST 消息发送给 CAMEL CAMEL 向服务器代理 HTTP POST 消息 并使用稍微调整的 U
  • 从 uiwebview Xcode 获取选定的文本

    我有一个UIWebView从加载文本htmlString 我需要当用户选择文本的一部分并按下按钮时 我将能够提取它以便在其他地方使用它 所以我使用以下代码 The JS File NSString filePath NSBundle mai
  • 根据单元格位置将选择性字段从 Excel 批量插入到 SQL

    我有一个 SSIS 包 我必须从 Excel 工作表中选择一些值并将它们插入到 SQL Server 数据库表中 我是通过执行 sql 任务来完成的 这些是步骤 从映射表中选择所有记录 单元格位置是动态的 因此将其保留在 SQL 表中 大约
  • 如何使用 Keras 将图像文件夹转换为 X 和 Y 批次?

    假设我有一个图像文件夹 例如 PetData Dog images Cat images 我如何将其转换为 x train y train x test y test 格式 我看到这种格式广泛用于 MNIST 数据集 如下所示 mnist
  • 如何与多个 ViewModel 共享多个 ObservableCollections?

    我正在编写一个有 4 个视图的程序 公司视图 会员查看 周视图 and 报告查看 每个都有对应的ViewModel和Model 我使用 PRISM BindableBase 来创建 ViewModel 数据绑定正确 公司视图模型包含一个对象