这完全是人们通常做的事情的逆转,所以我能找到的每一个信息都是关于将UI属性绑定到VM方法。
TL; DR
MVVM。 VM中的代码,通过通常的命令委托管理按钮上的单击的方法;在这种情况下,我完全正确地与UI分离。但是......从这里开始,我需要在UI容器内的UI控件上调用一个方法,这个VM容器绑定到该容器。这怎么可能?我可以以某种方式向VM添加属性,以便将属性值绑定到我需要调用的方法的XML中吗?
编辑更好地解释
用户按“打印”按钮。 VM接收命令。一切都是MVVM; VM对UI一无所知。我想尝试不破坏MVVM范例。
现在,用户按下“打印”按钮,因为他希望在纸上获得UI上许多Usercontrol的精确副本,因此我必须在每个上面调用一个方法,以便返回其位图表示。那些用户控件不公开“Bitmap”属性,我需要调用他们的方法。
答案 0 :(得分:0)
您可以创建一个名为IBitmapProvider的界面或类似的东西。给它一个像GetBitmap()的方法。让您的视图继承此接口。将界面传递给视图模型的构造。在命令上调用IBitmapProvider方法。
答案 1 :(得分:0)
如果没有一个更具体的问题,包括一个很好地显示你想要做的事情的Minimal, Complete, and Verifiable code example,就不可能确切知道最佳答案是什么。那说......
您的视图模型不应该处理打印命令。你的观点应该处理那个。使用ApplicationCommands.Print
或等效项,在视图中为Executed
事件处理程序创建命令绑定。视图模型根本不需要了解任何有关打印的信息。
此外,您提到使用位图,但实际上也没有必要这样做。打印API允许您直接打印Visual
;首先将Visual
渲染到位图然后打印位图是一种浪费,并且还会产生令人头疼的问题,试图将预期的输出分辨率与打印机的实际分辨率相匹配。
您可以直接打印实际的UI Visual
对象,也可以使用您用于视图的相同模板在新ContentControl
中引用现有的视图模型,甚至打印 - 如有必要,可以使用特定模板。有多种方法可以实现这一目标;你可以在另一个问题中找到一个简单的例子in an answer I provided。