【发布时间】:2012-12-26 00:11:57
【问题描述】:
我将在现有的 MVVM WPF 应用程序中介绍 View State 功能。目标是能够保存和加载(恢复)控件的特定状态。
问题更多的是从系统灵活性/可维护性的角度来看设计和最佳解决方案。
当前基础设施:
public abstract class ViewModelBase
{
protected ViewModelBase(...)
{
}
}
// and few more very the same ViewModel classes for different control types
public sealed class GridViewModel : ViewModelBase
{
protected GridViewModel(...)
: base(...)
{
}
}
我介绍了IViewState interface,因此每个特定的 ViewModel 都可以提供自己的实现,例如 GridViewState class,并通过以下方式将其放入 ViewModel 基础架构中:(想法是将 ViewState 的类型作为通用参数传递)
public abstract class ViewModelBase<TViewState>
where TViewState : class, IViewState
{
protected ViewModelBase(...)
{
}
public TViewState ViewState { ... }
}
- 将 View State 功能附加到 ViewModel 是个好主意吗?
- 通过像
class GridViewModel<GridViewState>这样的泛型Type参数引入特定ViewModel类型和ViewState之间的绑定关系是不是一个好的解决方案? - 在哪里以及为什么更好地定义诸如
LoadState() / SaveState(),IViewState本身或ViewModelBase这样的方法? - 还有其他设计解决方案吗?
【问题讨论】:
-
1 和 2 看起来很合理 3. LoadState() 和 SaveState() 更接近 IViewState 但是为了可扩展性和可维护性提供了持久性接口来委托保存,这允许实现多个持久性具体实现(例如数据库、xml、文件、ws、...)
-
关于加载/保存状态,我通过创建封装 ViewState + 两种方法的 IViewStateAware
将其与状态本身分离