我之前所做的是对数据对象进行深拷贝,然后编写一个通用的比较方法,使用反射器比较两个对象之间是否存在差异。
假设我有一个 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/