我有一个具有三个 View 的项目:

  • ChartsView
  • NewsView
  • 设置查看

  • 本质上,GraphsViewModel下载一些数据以Chart表示,NewsViewModel下载一些提要并将其表示为列表。两者都有一个计时器,该计时器决定下载数据的频率,因此,还有一个与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并通过消息(MVVM Light)发送给其他 View 所需的值非常复杂。 (在这种情况下,使两个主 View 工作所需的设置已定义在其中)

    我想错了吗?

    最佳答案

    这种情况下存在的解决方案与地球上生活的许多开发人员一样多:)

    这是我的方法:

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

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

    并在 View 模型之间共享该类的单例实例。
    在这里,我使用依赖注入(inject)来做到这一点:
    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;}
    }
    

    关于c# - 在这种情况下如何设计MVVM,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32860572/

    10-13 07:06