c# - 仅当数据更改时才允许用户保存的更好方法?

标签 c# wpf silverlight mvvm

我之前所做的是对数据对象进行深拷贝,然后编写一个通用的比较方法,使用反射器比较两个对象之间是否存在差异。

假设我有一个 SaveButton,一个与 ViewModel.PropertyA 绑定(bind)的 TextBoxA,初始 PropertyA 是 =“123”。

当用户在 TextBoxA 中键入“1234”时,PropertyA 设置方法将执行比较方法以找出差异。并启用保存按钮。

但是当用户将文本“1234”改回“123”时,“保存”按钮将再次禁用。

1 年后,现在我想知道是否有更好或更简单的方法来做到这一点? 即是否有任何框架可以做这种事情?所以我没有编写深复制对象的代码,而是自己编写比较方法?


我的实际 UI 并没有那么简单,只包含 TextBox 类型,这是一个用于编辑客户信息的 UI,因此有 DateTime、Collection 等。这就是为什么我编写了用于克隆整个对象的深复制方法。

最佳答案

假设您的 View 模型上的这些属性正在引发 PropertyChanged事件不知何故,因为问题被标记为 MVVM .

这是一种方法。为您的 ViewModel 的 PropertyChanged 编写事件处理程序事件。在私有(private)中保存原始值 Dictionary<string, string>仅当属性更改时。这样就无需复制整个对象,以防万一有人进行编辑。如果该属性已存在于字典中,那么您可以轻松确定它是否已改回其原始值。

编辑:哦,我在想 PropertyChangedEventArgs包含新旧值,但它没有。因此,为了做到这一点,您需要在 View 模型的属性 setter 中添加一些额外的方法调用,以评估每个属性的旧值和新值。

为了轻松设置启用和禁用保存按钮,应该有一个 bool将保存按钮的已启用属性绑定(bind)到 View 模型中的属性。

如果只要新值与原始值匹配就从字典中删除项目,那么如果字典包含任何项目,您的保存按钮启用属性可能只返回 true。

编辑 2: 对于集合类型,您希望将 View 绑定(bind)到 ObservableCollection View 模型上的属性。 Collection changed 事件确实为您提供了新旧项目的列表,因此在该事件处理程序中跟踪更改应该相当容易。

关于c# - 仅当数据更改时才允许用户保存的更好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8595575/

相关文章:

c# - 访客模式 "does not implement interface"错误

c# - 我表单上的一些控件没有出现在 foreach 循环中

c# - 如何通过比较将 lambda 表达式传递给 where 语句

c# - 将类声明为静态类和在 app.xaml 文件中创建实例有什么区别?

c# - 在 Silverlight 和 MVVM 的组合根中保持 DI 容器的使用

c# - 现有的 DI 框架使用和 Silverlight

c# - Automapper 映射属性意外地通过部分属性名称匹配

c# - 复选框绑定(bind)慢

wpf - 如何将 WPF 控件绑定(bind)到后面的代码?

wpf - 水平拉伸(stretch) WPF Canvas