如何在这种情况下设计MVVM

时间:2015-09-30 07:43:43

标签: c# mvvm mvvm-light

我有一个包含三个视图的项目:

  • ChartsView
  • 新闻浏览
  • SettingsView

基本上,GraphsViewModel下载一些数据以表示为Chart,NewsViewModel下载一些feed并将其表示为列表。两者都有一个计时器,用于决定下载数据的频率,因此还有一个与SettingsView相关联的SettingsViewModel,用户可以在其中决定此设置和其他一些设置。

问题是:如何设置SettingsViewModel?

我做的第一件事就是将SettingsView放在这样的内容中:

<Pivot>

    <PivotItem DataContext="{Binding Source={StaticResource Locator}, Path=GetNewsView}" Header="News Settings">
        ...
    </PivotItem>


    <PivotItem DataContext="{Binding Source={StaticResource Locator}, Path=GetChartView}" Header="Chart Settings">
        ...
    </PivotItem>

</Pivot>

这是一种不好的做法吗?在某处我读到要正确应用MVVM,我应该只使用每个View的ViewModel。但在这种情况下,似乎(对我而言)将设置放入SettingsViewModel并通过Message(MVVM Light)向其他Views发送所需的值是错综复杂的。 (在这种情况下,让两个主视图工作所需的设置被定义到它们中)

我认为错了吗?

1 个答案:

答案 0 :(得分:2)

这个场景有很多解决方案,因为许多开发人员都生活在这个星球上:)

我将如何做到这一点:

我会创建一些对象来存储设置:

public class SettingsModel
{
    public TimeSpan DownloadInterval {get; set;}
    ...
}

并在viewmodels中共享该类的单例实例。 在这里我使用依赖注入来做到这一点:

public class NewsViewModel
{
     public NewsViewModel(SettingsModel settings)
     {
         //do whatever you need with the setting
         var timer = new DispatcherTimer();
         timer.Interval = settings.DownloadInterval;

         //alternativly you can use something like SettingsModel.Current to access the instance
        // or AppContext.Current.Settings
        // or ServiceLocator.GetService<SettingsModel>()
     }
}

public class SettingsViewModel
{
     public SettingsViewModel(SettingsModel settings)
     {
        Model = settings;
     }

     public SettingsModel Model{get; private set;}
}