0

事件发生在我们的模型和视图模型中,需要创建适当的视图。问题是如何做到这一点并避免在 VM 或 M 中有任何 View 代码?

这是事件的顺序,因此您可以看到这个困境:

用户在表单中设置一个数字字段以启动一个长时间运行的后台进程,然后单击“开始”按钮。如果这个长期运行的过程成功,那么它需要弹出一个带有图表的图表来显示结果。但是,如果数据因任何原因处理失败,则无法弹出图表,而是会记录一条错误消息,该消息显示在表单的文本框中。

现在,该启动按钮调用 ViewModel 中的一个方法,该方法实际上启动了后台线程。

只有背景可以确定何时或是否创建视图。

目前,我们通过使用一个名为 ChartInterface 的接口来实现这一点。视图实现了这个接口,然后设置一个回调委托一直到后端模型。当它决定创建图表时,它会调用回调并使用接口传递适当的数据等。

但是,这会带来一个问题,因为它可能会生成数十或数百个图表。因此,我们需要一个“仪表板”,其中包含所有图表的列表,供用户选择要查看的图表。

所以现在后端需要决定何时或是否创建仪表板视图,然后将图表视图添加到其中。

所以它变得越来越混乱,因为这样的情况会越来越多,因为我们有很多需要视图的模型,所以创建大量的回调委托会很快变得丑陋。

一个似乎简化而不是大量回调的想法是只将一个接口传递给 ViewBinder 到后端。然后每次创建模型对象时,它可以将它传递给 ViewBinder 以查看它是否想将任何视图对象绑定到它。

我们的想法是,大多数后端对象都会(最终)以图形方式进行监控。所以如果他们每个人在构建之后都被传递给 ViewBinder 接口,那么视图可以决定是否要绑定任何东西。

这听起来总是更好。

4

1 回答 1

0

在处理代码时,答案变得很清楚。

公共接口 ModelBinderInterface { void TryBind( 对象模型); }

而不是一个全局“服务器定位器”,每个视图对象都更自然地实现这个接口。

然后,当它创建任何 ViewModel 对象时,它会将自己分配给 viewModel 对象的 ModelBinder 属性。

现在 ViewModel 可以将相同的接口传递给后端进程。

每当实例化任何相关模型时,它都会使用该对象调用 ModelBinder。

然后 View 对象可以决定它是否可以实例化该对象,如果不能,它可以将调用传递给它的父级,该父级也实现了 ModelBinderInterface。

这样,每个视图都可以处理它理解的实例化视图,无论是将控件添加到 DataGridView 还是将对象绑定到 ListView 等。

当然,这仍然允许使用单例 ModelBinder,因为较低级别可以继续将调用传递给只有一个并且可以提供单例实例的顶级应用程序 ModelBinder。

于 2013-02-22T18:53:12.883 回答