我必须按照MVVM模式将大小合适的Winforms应用程序转换为WPF应用程序。我不确定执行此操作的最佳方法是什么。
我的计划是为每个窗口创建一个视图模型,并有一个基本的视图模型,其中包含地图控件本身以及需要共享的所有属性/方法。
我不确定的主要事情是如何处理控件中内置的地图操作。例如,有一个MapMouse_Down事件。通常,如果我不关注MVVM并在那里进行处理,我只会将其放在代码中。那是解决这个问题的正确方法吗?
答案 0 :(得分:2)
通常,如果我不关注MVVM,我会将其放在代码后面,并在那里处理它。那是解决这个问题的正确方法吗?
您可以在视图的代码后面保留与 view 相关的所有内容,但应在视图模型中实现任何可测试的 application 逻辑。与视图相关的内容例如可以是动画以及以某种方式更改控件的行为或外观的任何代码,例如设置某些宽度或颜色。
根据所使用的控件类型,有不同的方法来处理MVVM中的“事件”,但是通常会在视图模型中定义命令并从视图中调用这些命令。有关更多信息,请参阅this blog post。
答案 1 :(得分:1)
为每种不同类型的窗口具有单独的视图模型是理想的。
视图模型不应包含控件。它们应仅包含控件的抽象。如果所有窗口都具有映射组件,则只有基本窗口视图模型才应具有映射控件的抽象。 (我正在谈论的一种抽象示例:假设一个视图,用户应该在其中输入名称。该视图将具有一个TextBox
,该属性具有一个Text
属性。该视图模型将具有Name
属性。视图会将TextBox
的{{1}}属性绑定到视图模型的Text
属性。为大型应用程序确定正确的抽象是其中之一。 MVVM的挑战。)
如果您的控件不支持数据绑定或不支持Name
,则在视图中具有事件处理程序是完全可以的。但是视图中的事件处理程序应该做的尽可能少,而只是将控制权转移到视图模型中,后者将更新视图的抽象表示,然后视图将通过数据绑定或手动同步逻辑与视图重新同步。
答案 2 :(得分:0)
对于Winforms,WPF有所不同,该方法基于对属性的绑定。
下面是使用MVVM的示例。
Easy MVVM Example