【问题标题】:WPF - Binding a VM property to a method of an UI objectWPF - 将 VM 属性绑定到 UI 对象的方法
【发布时间】:2016-06-17 14:36:36
【问题描述】:

这与人们通常所做的完全相反,所以我能找到的所有信息都是关于将 UI 属性绑定到 VM 方法。

TL;DR

MVVM。 VM 内的代码,一种通过通常的命令委托管理按钮单击的方法;在这种情况下,我完全正确地与 UI 分离。但是......从这里我需要在这个VM istance绑定到的UI容器内的UI控件上调用一个方法。这怎么可能?我能否以某种方式向 VM 添加属性,将 XML 中的属性值绑定到我需要调用的方法?


编辑解释得更好

用户按下“打印”按钮。 VM 接收命令。一切都是真正的 MVVM;虚拟机对 UI 一无所知。我想尽量不破坏 MVVM 范式。

现在,用户按下“打印”按钮,因为他想要在纸上精确复制 UI 上的许多用户控件,所以我必须在每个控件上调用一个方法,让我返回其位图表示。那些用户控件没有公开“位图”属性,我需要调用他们的方法。

【问题讨论】:

  • 做这种事情的常用方法是让虚拟机中的命令代码设置一个属性来指示虚拟机现在处于什么新状态,并引发PropertyChanged以防有人在听.然后,该视图将具有一个触发器,该触发器在该属性的值更改时执行适当的操作。如果没有更多关于你正在尝试做什么的细节,我不能给你更多细节。
  • 你要什么?您想将按钮绑定到 VM 中的命令,该命令应该调用视图类中的另一个方法?
  • 您正试图杀死 MVVM。您的虚拟机对视图一无所知。如果只需要 UI 控件,您可以使用按钮的 Click 事件在您的 UI 控件中做一些事情。
  • re:编辑:在我看来,您的打印命令与虚拟机完全无关。这是视图打印本身。在后面的代码中使用 Click 事件来执行此操作。至多,代码隐藏可能会将光栅图像拼接在一起,然后将其传递给视图模型上的一个方法——例如,如果您已经拥有广泛的视图模型支持打印,那么您可能希望使用该支持以保持一致性,在视图拼凑出一些可打印的东西之后。在没有任何令人信服的理由让 VM 参与的情况下,不要这样做。
  • 打印是一个 UI 问题,因此它的代码属于 UI 代码隐藏。 MVVM != 没有代码隐藏。

标签: c# wpf mvvm binding


【解决方案1】:

您可以创建一个名为 IBitmapProvider 或类似的接口。给它一个像 GetBitmap() 这样的方法。让您的视图继承此接口。将接口传递到视图模型的构造中。在命令上调用 IBitmapProvider 方法。

【讨论】:

    【解决方案2】:

    如果没有更具体的问题,包括一个很好的Minimal, Complete, and Verifiable code example,它清楚地表明了你想要做什么,就不可能确定最好的答案是什么。也就是说……

    您的视图模型不应该处理打印命令。你的观点应该处理这个问题。使用ApplicationCommands.Print 或等效项,在视图中为视图中的Executed 事件处理程序创建命令绑定。视图模型不需要知道任何关于打印的事情。

    此外,您提到使用位图,但实际上也没有必要这样做。打印 API 允许您直接打印Visual;先将Visual 渲染为位图,然后再打印位图是一种浪费,而且还会让人头疼,试图将您的预期输出分辨率与打印机的实际分辨率相匹配。

    您可以直接打印实际的 UI Visual 对象,也可以使用与视图相同的模板在新的 ContentControl 中引用现有视图模型,如果是,甚至可以使用特定于打印的模板必要的。有多种方法可以做到这一点;你可以在另一个问题中找到一个简单的例子in an answer I provided

    【讨论】:

      猜你喜欢
      • 2014-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多