gpt4 book ai didi

c# - 这种情况下如何设计MVVM

转载 作者:行者123 更新时间:2023-12-03 10:27:36 25 4
gpt4 key购买 nike

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

  • 图表查看
  • 新闻查看
  • 设置查看

  • 本质上,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 并通过 Message (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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com