如何使用 WF4 与 MVVM 和 WPF 将 ViewModel 传递给 CodeActivity

发布于 2025-01-02 05:52:47 字数 750 浏览 2 评论 0原文

我正在尝试将当前的 WPF/MVVM 应用程序集成到 Workflow Foundation 4.0。

目前,我的 ViewModel 方法之一正在调用我的示例 CodeActivity 并向其发送一些参数。

在我的 CodeActivity 执行方法中,我需要从调用 ViewModel 调用一些方法。我想知道做到这一点的最佳方法是什么。到目前为止,我已经确定了三种可能的方法:

  1. 将我的 ViewModel 实例作为输入参数发送到我的 CodeActivity
  2. 通过 CodeActivity 中的构造函数发送我的 ViewModel 实例,例如 public MyCodeActivity(ViewModel vm)
  3. 将我的 CodeActivity 包装在 WorkflowApplication 中并将我的 ViewModel 实例作为使用 SynchronizationContext 扩展

到目前为止,我已经测试了选项 2 和 3,它们显然工作得很好。

避免线程同步问题或其他问题的最佳方法是什么?

提前致谢,

编辑: 仅提一下可能的情况:如果用户从视图中的给定下拉列表中选择值“X”,我需要将对象 childA 和 childB 添加到通过 ViewModel 中的公共属性公开的 ParentObject 包含的 ObservableCollection 中。创建子对象并将其添加到父对象的逻辑位于我的 ViewModel 中。但我希望工作流包含业务规则本身。

I am trying to integrate my current WPF/MVVM application to Workflow Foundation 4.0.

Currently one of my ViewModel methods is invoking my sample CodeActivity sending it some parameters.

Inside of my CodeActivity execute method I need to call some methods from the calling ViewModel. I would like to know what the best approach is to do this. So far I have identified three possible ways:

  1. Send my ViewModel instance as an input argument to my CodeActivity
  2. Send my ViewModel instance through a Constructor in my CodeActivity like public MyCodeActivity(ViewModel vm)
  3. Wrap my CodeActivity in a WorkflowApplication and send my ViewModel instance as an extension using SynchronizationContext

So far I have tested options 2 and 3 and they work well apparently.

What is the optimal way to do this to avoid any issues like thread synchronization problems or other?

Thanks in advance,

Edit:
Just to mention a possible scenario: If user picks value 'X' from a given dropdown list in my View I need to add object childA and childB to an ObservableCollection contained by a ParentObject exposed through a public property in my ViewModel. The logic to create the child objects and add them to the parent are in my ViewModel. But I want Workflow to contain the Business Rule itself.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦回梦里 2025-01-09 05:52:47

为什么您的 CodeActivity 需要了解有关特定视图模型的任何信息?我会寻找另一种解决方案,使您的活动尽可能保持独立性。我立即想到了两个选项:

  1. 使用抽象类或接口,以便您的活动不绑定到单个视图模型,即 InArgument
  2. 使用事件聚合促进通信模式(如果可能,如果是 WF4,对此还不太确定?),即为 Activity 提供完成其工作所需的内容,并让您的视图模型侦听事件以从 Activity 接收更新,

而无需了解具体信息对于您的应用程序,我不知道哪个选项最有效(或根本有效),但我会避免给定视图模型和给定 CodeActivity 之间的直接连接。

Why does your CodeActivity need to know anything about a specific view model? I would look for another solution that allows your activity to maintain as much independence as possible. Two options I can think of off the top of my head:

  1. Use an abstract class or interface so that your activity is not bound to a single viewmodel, i.e., InArgument<IViewModel>
  2. Facilitate communication using an event aggregation pattern (if possible if WF4, not too sure on this yet?), i.e., give the activity what it needs to do it's job and let your view model listen for an event to receive updates from the activity

Without knowing the specifics of your application, I don't know which option would work best (or work at all), but I would avoid a direct connection between a given view model and a given CodeActivity.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文