.net 通过添加视图状态功能修改现有MVVM基础结构

.net 通过添加视图状态功能修改现有MVVM基础结构,.net,wpf,mvvm,wpf-4.0,.net,Wpf,Mvvm,Wpf 4.0,我将在现有的MVVMWPF应用程序中引入视图状态特性。目标是能够保存和加载(恢复)控件的特定状态 问题更多的是从系统灵活性/可维护性的角度来看设计和最佳解决方案 当前基础设施: 公共抽象类ViewModelBase { 受保护的ViewModelBase(…) { } } //对于不同的控件类型,几乎没有其他完全相同的ViewModel类 公共密封类GridViewModel:ViewModelBase { 受保护的GridViewModel(…) :base(…) { } } 我介绍了IVi

我将在现有的MVVMWPF应用程序中引入视图状态特性。目标是能够保存和加载(恢复)控件的特定状态

问题更多的是从系统灵活性/可维护性的角度来看设计和最佳解决方案

当前基础设施:

公共抽象类ViewModelBase
{
受保护的ViewModelBase(…)
{
}
}
//对于不同的控件类型,几乎没有其他完全相同的ViewModel类
公共密封类GridViewModel:ViewModelBase
{
受保护的GridViewModel(…)
:base(…)
{
}
}
我介绍了
IViewState接口
,因此每个特定的ViewModel都可以提供自己的实现,比如
GridViewState类
,并将以以下方式将其放入ViewModel基础结构中:(想法是将ViewState的类型作为通用参数传递)

公共抽象类ViewModelBase
其中TViewState:类,IViewState
{
受保护的ViewModelBase(…)
{
}
公共TViewState视图状态{…}
}
  • 将视图状态功能附加到ViewModel是一个好主意吗
  • 通过像
    class GridViewModel
    这样的泛型类型参数,在特定的ViewModel类型和ViewState之间引入绑定关系,这是一个好的解决方案吗
  • 在何处以及为什么更好地定义此类方法,如
    LoadState()/SaveState(),
    IViewState
    本身或
    ViewModelBase
  • 还有其他设计解决方案吗

  • 是否有什么原因使您不持久化域对象,而只是在加载视图模型时从这些对象重建视图模型?您的视图会保持什么样的状态,而您的域类不会?如果它与视觉元素(如位置和位置)相关,我会将它们放入设置类中,并将其持久化

    我假设有一些底层逻辑和类代表你的领域,如果没有,那么你的视图模型就是你的领域,你的想法是可靠的

    我可能会考虑类似的模式来重新水化您的虚拟机,因为它们可能有相当多的事件和其他关系(例如集合项的属性更改事件),无法序列化,必须重新创建


    有很多持久性模式,但从您的命名和解释来看,memento看起来很合适。

    1和2看起来合理3。LoadState()和SaveState()更接近IViewState,但为了可扩展性和可维护性,提供了一个持久性接口,以将保存过程简化为,这允许实现多个持久性具体实现(例如数据库、xml、文件、ws等)关于加载/保存状态,我已经通过创建IViewStateAware将其与状态本身分离,该IViewStateAware封装了ViewState+这两种方法ViewModel是一个复杂的实体,它不由单个域实体表示。ViewState应保留诸如排序、列顺序、用户布局首选项等UI设置,这是ViewModel表示的10%的数据。VM通常表示多个域实体,但通过重新水化这些实体,仍然可以返回到当前VM状态。如果有纯粹的视觉元素需要保留,你有没有理由不创建一个用户首选项对象,并将其视为任何其他域实体?没有,还有其他实体,它们是业务实体,还有一些自定义标准保存到设置中。我有点困惑。如果您已经将视图自定义保存到设置对象中,那么您希望保存什么状态?如果它是真正不属于VM的数据(即,你真的认为它是视图状态而不是VM状态),那么我可能只是将它保存到视图的加载/关闭事件中,将其加载到App.CONFIG(或用户隔离存储)中。若它相当复杂,或者你们只是想尝试设计模式,那个么memento似乎很合适。目前我保存的不是UI自定义设置,而是用户设置,比如过滤器值、自定义标准等,这是完全不同的设置。现在我试着介绍ViewState,它只知道视图布局设置,如排序等。问题是一些ViewState设置将由ViewModel使用,例如排序条件,一些将不会使用,如列顺序,此类设置可以由视图本身处理。