gpt4 book ai didi

wpf - 来自 ICommand 的反馈

转载 作者:行者123 更新时间:2023-12-03 10:16:04 25 4
gpt4 key购买 nike

我有一个 ICommand实现是独立的。它修改有关实体的信息。同一实体绑定(bind)到 View ,作为 View 的 ViewModel 的属性.

我想要实现的是,在执行命令后,实体(以及因此是 ViewModel,因此是 View )使用新信息进行更新。我的理解方式,ICommand -s 是单向街道。他们修改基础数据,但不应该给出直接结果。

所以我通过发送 Message 来实现这一点通过使用 MVVMLight 框架,在命令执行结束时从命令中获取。暴露实体的 View 模型也订阅相同的消息并在收到消息时更新自身(更新的信息作为消息的属性传递)。

额外的好处是其他 View 模型也可以订阅和响应相同的事件。然而,它的“味道”是这个实现的主干是events。 .根据我的阅读,事件的整个概念并不适合 MVVM 模式。还是可以这样进行跨VM通信?

例子:

领域模型

  • 用户
  • First Name
  • Last Name
  • Full Name { get { return First Name + Last Name } }

  • 查看型号
  • 用户 View 模型 - 环绕 User Domain Model , 但不存储它的实例
  • string First Name
  • string Last Name
  • string Full Name (注:不知道它是如何计算的)
  • ICommand Change First Name
  • 方法:MapFromDomainModel(UserDomainModel) .当 View Model 接收到 UserDomainChanged 时调用信息。

  • 命令
  • Change First Name : ICommand
  • 更改 First NameUser Domain Model
  • 发送 UserDomainChanged(UserDomainModel)留言

  • 看,在这个例子中, View 模型不知道 Full Name被计算并且不/不应该知道当 First Name已更改, Full Name也应该改变。这就是命令直接在域模型上工作并触发消息的原因。

    此外,我可能在窗口中有其他 View ,它们的 View 模型绑定(bind)到相同的用户域模型。通过订阅相同的消息,他们可以独立更新自己。

    这是一个好方法吗?有更好的吗?

    最佳答案

    The way I understand it, ICommand-s are one-way street. They modify the underlying data, but are not supposed to give a direct result.



    你是对的。 ICommand 接口(interface)的 Execute 方法的返回类型为 void,这意味着它不会向命令的调用者返回任何类型的值或结果。

    Or cross-VM communication is OK to be done this way?



    是的。使用事件聚合器或信使在两个对象之间进行通信与使用普通事件之间的最大区别在于耦合。当您订阅普通事件时,您会在事件的发布者和订阅者之间创建紧密耦合。订阅者需要对发布者的强引用才能订阅事件,而发布者需要通过事件处理程序委托(delegate)对订阅者的引用才能发布事件。这会导致组件之间的紧密耦合,进而导致应用程序的可维护性降低。

    通过在发布者和订阅者之间引入事件聚合器,您可以消除这种紧密耦合。订阅者观察事件聚合器而不是发布者,并且发布者只知道事件聚合器而不知道订阅者。如果您想了解大致情况,请参阅以下博客文章: https://blog.magnusmontin.net/2014/02/28/using-the-event-aggregator-pattern-to-communicate-between-view-models/

    Is this a good approach? Is there a better one?



    是的。使用事件聚合器/信使以松散耦合的方式在组件之间进行通信通常是一种好方法。另一种选择是使用共享服务。这只是一个以解耦方式为多个组件提供功能的类。它应该实现一个接口(interface),并且您通常将其注册为您的 IoC 容器中的单例: https://social.msdn.microsoft.com/Forums/en-US/22907a0f-d805-4195-8272-7c284b72d2ee/example-of-using-shared-services-prism?forum=wpf

    请注意,在此特定示例中,您可能还可以将 View 模型的 FirstName 属性绑定(bind)到 View 中的目标属性,并在您希望刷新 View 而不是调用命令时引发 FullName 属性的 PropertyChanged 事件,但我猜您有理由调用命令然后使用事件聚合器或信使向外界发布消息是完全可以的。

    关于wpf - 来自 ICommand 的反馈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41443932/

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