【问题标题】:Modifying an existing MVVM infrastructure by adding View State feature通过添加 View State 功能修改现有的 MVVM 基础架构
【发布时间】: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 { ... }
}
  1. 将 View State 功能附加到 ViewModel 是个好主意吗?
  2. 通过像class GridViewModel&lt;GridViewState&gt;这样的泛型Type参数引入特定ViewModel类型和ViewState之间的绑定关系是不是一个好的解决方案?
  3. 在哪里以及为什么更好地定义诸如 LoadState() / SaveState(), IViewState 本身或 ViewModelBase 这样的方法?
  4. 还有其他设计解决方案吗?

【问题讨论】:

  • 1 和 2 看起来很合理 3. LoadState() 和 SaveState() 更接近 IViewState 但是为了可扩展性和可维护性提供了持久性接口来委托保存,这允许实现多个持久性具体实现(例如数据库、xml、文件、ws、...)
  • 关于加载/保存状态,我通过创建封装 ViewState + 两种方法的 IViewStateAware 将其与状态本身分离

标签: .net wpf mvvm wpf-4.0


【解决方案1】:

您是否有理由不保留域对象,而只是在加载时从这些对象中重建 ViewModel?你的观点认为你的领域类不会持有什么样的状态?如果它与位置和位置等视觉元素相关,我会将它们推送到设置类中并坚持下去。

我假设有一些底层逻辑和类代表您的域,如果不是,那么您的 ViewModel 真的是您的域并且您的想法是可靠的。

我可能会查看memento 之类的模式来为您的虚拟机补充水分,因为它们可能会有一些无法序列化且必须重新创建。

那里有很多持久性模式,但从你的命名和解释来看,纪念品看起来很合适。

【讨论】:

  • ViewModel 是复杂实体,不由单个域实体表示。 ViewState 应该包含 UI 设置,如排序、列顺序、用户布局首选项等,这是 ViewModel 表示的数据的 10%。
  • VM 代表多个域实体是很常见的,但通过重新水合这些实体应该仍然可以返回到当前 VM 状态。如果您想要保留纯粹的视觉元素,您是否有理由不只是创建一个用户偏好对象并将其视为任何其他域实体?
  • 不,还有其他实体,它们是业务实体,还有一些自定义标准保存到设置中
  • 我有点困惑。如果您已经将视图自定义保存到设置对象中,那么您要保存什么状态?如果它是真正不属于 VM 的数据(即您真的认为它是视图状态而不是 VM 状态),那么我可能只是将其保存/加载到加载/关闭中的 app.config(或用户隔离存储)视图的事件。如果它相当复杂,或者您只是想尝试设计模式,那么纪念品似乎很适合。
  • 目前我保存的不是 UI 自定义设置,而是过滤值、自定义条件等用户设置。这是完全不同的设置。现在我正在尝试介绍 ViewState,它只知道视图布局设置,如排序等。问题是 ViewModel 将使用一些 ViewState 设置,例如排序标准,而有些则不会使用,比如列顺序,这种设置可以由 View 自己处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多