在我的应用程序中为主视图添加额外功能时,我意识到代码量很快就会成为一个问题(目前我的viewmodel中有大约600行代码,我还有很多要添加的内容)。
我一直在寻找有关如何将视图拆分/设计为较小组件的文章,但我还没有找到令人满意的解决方案。一个人建议使用子视图模型,但会出现其他问题(视图模型之间的依赖关系)。
我曾想过使用用户控件,但我在其他视图上使用的视图上没有任何内容,因此它会破坏用户控件的目的。
在这种情况下,什么是正确的方法?
谢谢, 阿德里安
答案 0 :(得分:3)
如果要将视图拆分为组件部分,则需要进行视图合成。如果您正在构建MVVM应用程序,那么you should really be using an MVVM framework。像Caliburn.Micro之类的东西使得视图合成非常容易。
视图模型之间不一定存在依赖关系,它们应该只知道生成视图所需的内容。这可以是父视图模型包含的业务对象的子集。由于父视图模型将引用所有子视图模型,因此它可以在构造时将业务对象的相关部分传递给它们。
答案 1 :(得分:1)
我也同意Caliburn.Micro是一个很好的解决方案,可以将您的应用程序拆分为更小的组件。
在Caliburn.Micro中,视图模型之间的通信基于Event aggregator模式。
这使得视图模型之间的松散耦合
答案 2 :(得分:1)
我同意使用Caliburn Micro。
但是,要玩魔鬼的拥护者,您可以将ViewModel文件拆分为单独的文件(相同的类名),并在partial
关键字之前使用class
关键字。它通常更整洁,一步一步(不破坏前体)从分解成单独的类。
答案 3 :(得分:0)
分裂并不理想。
看起来Caliburn工具包专注于事件,而我的应用程序在很大程度上依赖于ICommand实现。
对我来说,与Caliburn.Micro的第一次相遇并不令人满意。 这个设置似乎是针对VS2010量身定制的 - 这对我来说很有意义 - 因为我确实有VS2010 pro。但我迷失在Silverlight的设置中。 与像Prism这样的工具包相比,它缺乏开始的便利性。 现在需要很长时间才能切换。 我使用自己的MVVM范例,它不像Caliburn那样抽象,它在任何地方集成了多语言支持,并且由于Binding / DataContext范例的性质,它只是面临一些可接受的问题,因为某些来源变得太大了。 对于这个问题,我接受“部分类”是一个解决方案 - 即使我知道有更优雅的解决方案可用。
在我的工作中,我无法改变其他工具包。
所以我轻轻地等待微软允许更多关于Binding / DataContext范例的灵活性。
可能是Caliburn显示更多智能将视图模型分配给某个项目的情况。可以 ? (我认为确实如此。)
另一种选择可能是定义一个自定义(xaml可用)对象,该对象触发一个自定义分配器,该控件将分配给哪个视图模型。怎么样?