【发布时间】: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 != 没有代码隐藏。