我刚刚使用mvvmlight创建了我的第一个c# / XAML应用程序,并且我已经尽力实现了MVVM模式(WP8应用程序)。然而,我已经慢慢地将我的代码变成了某种风格,我认为它没有正确地实现该模式!任何关于事情应该如何发展的建议都会有很大的帮助。
例如,使用mvvmlight,我大量使用了ViewModelLocator。我的一些视图模型是立即创建的,比如SettingsViewModel (有一个SettingsView)。
SimpleIoc.Default.Register<SettingsViewModel>(true);然后在我的项目中的其他地方,我的其他视图模型将通过属性或方法直接访问此视图模型以获取临时信息……像这样;
mySetting = ViewModelLocator.SettingsStatic.GetSomeSetting(var);我担心的是,我的视图模型越来越多地以这种方式相互交谈。这样做的问题是,它们现在可能无法独立测试,因为它们需要或假设存在其他视图模型。
这里的任何指针都会很棒!
编辑:另一个例子是使用PersonView,并且PersonViewModel有一些用于UI显示的辅助方法。在某些情况下,我有其他视图需要显示此信息...我使用viewmodel定位器来访问它们,而不是在当前的viewmodel中再次编写helper方法。
发布于 2013-05-01 00:28:44
你的想法是正确的,视图模型依赖于视图模型将会带来麻烦。当我需要访问我的应用程序中的“全局”设置时,我使用一个可以注入到视图模型的构造函数中的接口。因此,您可以创建一个包含所需属性和方法的ISettingsService。还可以创建模拟或伪造ISettingsService接口的数据/属性的设计时设置服务
然后在视图模型定位器中使用以下内容:
if (ViewModelBase.IsInDesignModeStatic) {
SimpleIoc.Default.Register<ISettingsService, DesignSettingService>();
} else {
SimpleIoc.Default.Register<ISettingService, SettingService>();
}创建DesignSettingService和SettingService,它们都实现ISettingsService。
对于vewmodels,SimpleIOC将解析/注入传递到类的构造函数中所需的元素。如果你有一个名为MyViewModel的类/视图模型,并且它想要使用settingsservice,那么你可以像这样定义构造函数:
private ISettingsService _SettingsAccess;
public New(ISettingsService SettingsService)
{
_SettingsAccess = SettingsService;
SettingProperty= _SettingsAccess.GetProperty;
}当此服务在构造函数中解析时,这将使视图模型保持解耦,这样您就可以更改ISettingsService的实现,而不会破坏使用它的每个视图模型。
我使用INavigationService来处理我的应用程序中的所有导航事件,这允许我基于另一个视图模型属性取消导航,而不需要当前视图模型直接调用/引用其他视图模型。
一个视图模型永远不应该直接调用另一个视图模型。使用此方法,您可以将所需的任意多个“服务”传递给视图模型。除了navigationservice之外,我使用的每个视图模型都会获得一个连接到我的模型的数据服务。即。处理人员的视图模型得到一个IPeopleDataService,其中该服务包含影响数据库的所有CRUD操作。这样,我就可以更改数据库和服务函数中的people对象,而不必更改people视图模型。
我希望这能帮到你。
https://stackoverflow.com/questions/16057472
复制相似问题