这种情况如何设计MVVM
How to design MVVM in this situation
我有一个包含三个视图的项目:
- 图表视图
- 新闻视图
- 设置视图
本质上,GraphsViewModel 下载一些数据以表示为图表,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,每个视图应该只使用 ViewModel。但在这种情况下,(对我而言)将设置放入 SettingsViewModel 并通过消息(MVVM Light)向其他视图发送他们需要的值似乎很复杂。 (在这种情况下,让两个主要视图工作所需的设置已定义到它们中)
我是不是想错了?
地球上有多少开发人员,就有多少解决方案:)
这是我的做法:
我会创建一些对象来存储设置:
public class SettingsModel
{
public TimeSpan DownloadInterval {get; set;}
...
}
并在视图模型之间共享 class 的单例实例。
在这里我使用依赖注入来做到这一点:
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;}
}
我有一个包含三个视图的项目:
- 图表视图
- 新闻视图
- 设置视图
本质上,GraphsViewModel 下载一些数据以表示为图表,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,每个视图应该只使用 ViewModel。但在这种情况下,(对我而言)将设置放入 SettingsViewModel 并通过消息(MVVM Light)向其他视图发送他们需要的值似乎很复杂。 (在这种情况下,让两个主要视图工作所需的设置已定义到它们中)
我是不是想错了?
地球上有多少开发人员,就有多少解决方案:)
这是我的做法:
我会创建一些对象来存储设置:
public class SettingsModel
{
public TimeSpan DownloadInterval {get; set;}
...
}
并在视图模型之间共享 class 的单例实例。 在这里我使用依赖注入来做到这一点:
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;}
}