我有一个具有三个 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并通过消息(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/