WPF监视属性更改

3

我经常有以下任务:

我有一组对象(例如客户),想要为用户提供这些对象的编辑器。通常,在编辑器的左侧有一些列表控件,右侧是一个表单。表单显示当前在左侧选择的对象的属性。

关于任何更改的确认,至少有两种策略:

  • 使编辑器成为模态对话框,并给出OK / Cancel按钮。在点击OK后保存所有对象的更改
  • 在右侧的表单上方或下方放置一个Save按钮,允许用户确认对当前选择的对象所做的更改。

我的问题是关于第二种策略的,它实现了一个MVVM应用程序与WPF:

我想向用户提供反馈,说明有未保存的更改。像文本编辑器这样的应用程序通常通过在发生任何更改时启用Save按钮来解决此问题,并在用户按下按钮确认更改后再次禁用它。

如果我理解正确,我需要监视表单中所有绑定属性的更改(由模型类支持)。通常,我的模型类使用自动属性(没有显式的getter和setter)。我是否必须为所有属性编写显式的getter以在任何更改时启用Save按钮,还是有更聪明的方法来实现这一点?


1
你可以使用BindingGroup来实现。 - dymanoid
2个回答

4

按照MVVM模式,您的ViewModel应该实现INotifyPropertyChanged接口,然后您就可以轻松订阅PropertyChanged事件并监视属性更改。


当然这是一个解决方案,但据我所知,它需要为所有属性设置显式的setter/getter,而GazTheDestroyer提供的解决方案只需要进行比较和一个处理程序。就性能而言,你的解决方案可能更胜一筹。 - NicolasR

1
如果您不想在模型类中编写INPC感知getter和setter,那么另一种方法是编写一个相等比较方法,然后让您的保存命令可用性回调调用它来比较“实时”对象与编辑后的对象。我假设您有一个被克隆的对象正在被编辑,以便在用户选择不保存时回滚。
WPF会在用户点击和输入时自动调用它,或者您可以使用CommandManager.InvalidateRequerySuggested()给出提示。

这看起来正是我想要的。编写一个CanExecute处理程序来代替每个属性的setter似乎更有效率。但我不知道最终的成本会有多高。CanExecute似乎经常被调用。即使在两个表单元素之间进行焦点更改也会触发它两次,而且在TextBox中的每次打字都会触发它!我会再看看的... - NicolasR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接