0

我刚刚使用 mvvmlight 创建了我的第一个 c# / XAML 应用程序,并且我尝试尽我所能实现 MVVM 模式(WP8 应用程序)。但是,我已经慢慢地将我的代码变成了某种风格,我认为它没有正确实现该模式!任何关于事情应该如何的建议都会有很大帮助。

例如,使用 mvvmlight 我大量使用 ViewModelLocator。我的一些视图模型会立即创建,例如 SettingsViewModel(有一个 SettingsView)。

SimpleIoc.Default.Register<SettingsViewModel>(true);

然后在我项目的其他地方,我的其他视图模型将通过属性或方法直接访问此视图模型以获取偶尔的信息……就像这样;

mySetting = ViewModelLocator.SettingsStatic.GetSomeSetting(var);

我担心的是我的视图模型越来越多地以这种方式相互交谈。问题在于它们现在可能无法独立测试,因为它们需要或假设存在其他视图模型。

这里的任何指针都会很棒!

编辑:另一个例子是有一个 PersonView,而 PersonViewModel 有一些用于 UI 显示的辅助方法。在某些情况下,我还有其他需要显示此信息的视图....并且我使用 viewmodellocator 来获取它们,而不是在当前视图模型中再次编写辅助方法。

4

1 回答 1

2

您认为依赖于视图模型的视图模型会造成麻烦是正确的。当我需要访问我的应用程序中的“全局”设置时,我使用一个可以注入到视图模型的构造函数中的接口。因此,您可以创建一个包含所需属性和方法的 ISettingsService。您还创建了一个设计时设置服务,它模仿或伪造 ISettingsService 接口的数据/属性

然后在您的视图模型定位器中使用:

if (ViewModelBase.IsInDesignModeStatic) {
    SimpleIoc.Default.Register<ISettingsService, DesignSettingService>();
} else {
    SimpleIoc.Default.Register<ISettingService, SettingService>();
}

创建实现 ISettingsService 的 DesignSettingService 和 SettingService。

至于您的 vewmodels,SimpleIOC 将解析/注入传递给类的构造函数的所需元素。如果您有一个名为 MyViewModel 的类/视图模型,并且它想使用设置服务,那么您将像这样定义构造函数:

private ISettingsService _SettingsAccess;

public New(ISettingsService SettingsService)
{
    _SettingsAccess = SettingsService;
    SettingProperty= _SettingsAccess.GetProperty;
}

这使视图模型保持解耦,因为此服务在构造函数中解析,这样您就可以更改 ISettingsService 的实现,而不会破坏使用它的每个视图模型。

我使用 INavigationService 来处理我的应用程序中的所有导航事件,这允许我取消基于另一个视图模型属性的导航,而无需当前视图模型直接调用/引用另一个视图模型。

一个视图模型不应该直接调用另一个视图模型。使用此方法,您可以将所需的任意数量的“服务”传递给视图模型。除了导航服务之外,我使用的每个视图模型都有一个连接到我的模型的数据服务。IE。与人打交道的视图模型获得一个 IPeopleDataService,其中该服务包含影响数据库的所有 CRUD 操作。这样我就可以更改数据库和服务功能中的人员对象,而无需更改人员视图模型。

我希望这有帮助。

于 2013-04-30T16:28:44.410 回答