0

我有一个要求,我必须实现 3 步保存功能

我有一个 MainView,它分为两部分:

  • 左部分有一个UserControl里面有一个TreeView
  • Right Part 有一个ContentControlwhich hostsUserControl取决于在TreeViewUserControl.

为了解释 senario,我给你一个例子。

如果我单击叶节点,则将填充 Data UserControl,并为 Model -> ViewModel-> View(UserControl) 填充相应选定 TreeView 项的数据。如果用户更改数据然后保存它必须临时保存,如果用户取消所有更改必须丢弃。将新节点添加到 TreeView 时应演示相同的行为。

只有当用户在 File 菜单中单击 Save 时,数据才会被序列化并保存到磁盘。

此外,如果用户试图离开,我希望阻止他们这样做,直到他们保存或取消他们的更改。

在这样的场景中保存这些数据对象的临时状态时,我遇到了问题。我尝试使用浅拷贝,但这不起作用,因为它只提供主实体的引用(在读取文件时初始化)。

还有其他方法吗?

4

2 回答 2

0

您的问题确实与 WPF 或 MVVM 没有太大关系。您需要跟踪模型状态的变化,并能够从您的视图模型中查询所有模型的状态,以确定是否应该允许用户离开。

不幸的是,框架本身并不支持这种模式。你必须自己写。

我将如何(大致)做到这一点:

每个模型都会实现一个接口,比如说IDirty。该接口具有以下属性/方法:

  • 脏{得到; }
  • 取消编辑();
  • 接受编辑();

创建后,模型不是脏的 ( IsDirty == false)。随着它的属性发生变化,它变成了 Dirty。所有属性的原始状态也会被记住。如果用户取消,则CancelEdit()调用 then 并恢复原始状态。如果AcceptEdit()被调用,则原始状态将被当前状态覆盖。

我还将创建自定义ObservableCollection实现,允许我查询其中包含的所有模型的状态,以确定是否有任何模型是脏的。我的 ViewModel 也是如此,因此 View 可以绑定到 ViewModel 的IsDirty属性,该属性会查询 ViewModel 中的所有模型集合。同样,对 和 的调用CancelEditAcceptEdit被链接起来,因此您可以(例如)调用AcceptEdit()ViewModel 并且其中的所有模型都将AcceptEdit调用它们。

这对编码来说可能变得非常乏味。我确信有一些框架旨在提供这种类型的功能。我只是不知道任何副手。

于 2011-07-08T13:41:49.330 回答
0

如果您使用标准的 WPF 绑定方法,那么很难实现健壮的表单处理。

这是因为 IsDirty 有 2 种类型,ViewModel.IsDirty(您的责任)和 Binding.IsDirty(WPF 责任)。

Binding.IsDirty 在 TextBox 文本值已更改但未发送到绑定源时发生。

ViewModel.IsDirty 可能为假,而 Binding.IsDirty 为真。

发生这种情况是因为 TextBox 默认的 UpdateSourceTrigger 是 LostFocus,而不是 PropertyChanged。

必须采用这种方式,否则编辑 DateTime (等)将与用户发生冲突(在部分编辑期间验证将失败,并且将不断重新格式化用户输入)

不幸的是,WPF Binding 类没有实现 IsDirty 功能,即使认为它非常适合这样做,它也可以访问源 (ViewModel) 和目标 (TextBox),并通知所有相关事件。

此外,Binding 类的设计不适合使用此功能进行扩展。IMO 它是一个“黑匣子”,是如何不设计软件的一个很好的例子。

我的解决方案是创建我自己的 Binding 类,然后我就可以再次工作。

于 2013-02-22T14:14:08.263 回答