WPF MVVM - 如何检测视图是否“脏”
目前,如果视图上的任何字段已更改/更新,我需要通知我的应用程序用户。
例如,如果用户更改视图上的日期字段,然后尝试关闭视图,应用程序将显示一条消息,要求用户继续并放弃更改或取消,以便他们可以单击“保存”按钮。
问题是:如何检测视图中任何数据字段的更改?
希望这是有道理的,比你提前问候,
I currently have a requirement to notify my application user if any fields have been changed/updated on a View.
For example, if the user changes a date field on the View and then tries to close the View, the application would display a message asking the user to Continue and lose changes or Cancel so that they can click the Save button.
Problem is: How do I detect that any of the data fields changed in the View?
Hope this makes sense, than you in advance, regards,
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以采取的一种方法是利用
IChangeTracking< /code>
和
INotifyPropertyChanged
接口。如果您创建视图模型继承的抽象基类 (
ViewModelBase
),该基类实现了IChangeTracking
和INotifyPropertyChanged
接口,那么您可以拥有自己的视图模型库附加到属性更改的通知(实际上表明视图模型已被修改),并且它将设置IsChanged
属性为true 表示视图模型是“脏的”。使用这种方法,您依靠通过数据绑定的属性更改通知来跟踪更改,并在进行任何提交后重置更改跟踪。
在您描述的情况下,您可以处理
已卸载
或关闭
视图事件以检查DataContext
;如果 DataContext 实现了 IChangeTracking,您可以使用 IsChanged 属性来确定是否进行了任何未接受的更改。简单示例:
One approach you can take is to leverage the
IChangeTracking
andINotifyPropertyChanged
interfaces.If you create an abstract base class that your view models inherit from (
ViewModelBase
) which implements theIChangeTracking
andINotifyPropertyChanged
interfaces, you can have your view model base attach to notification of property changes (in effect signaling that the view model has been modified) and which will set theIsChanged
property to true to indicate that the view model is 'dirty'.Using this approach, you are relying on property change notification via data binding to track changes and would reset the change tracking after any commits are made.
In the case you described you could handle the
Unloaded
orClosing
event of your view to inspect theDataContext
; and if the DataContext implementsIChangeTracking
you can use the IsChanged property to determine if any unaccepted changes have been made.Simple example:
在 MVVM 中,视图绑定到视图模型,视图模型又绑定到模型。
视图不能是脏的,因为它的更改会立即反映到视图模型。
如果您希望仅在“确定”或“接受”时将更改应用于模型,
将视图绑定到不将更改应用于模型的视图模型,
直到执行ApplyCommand或AcceptCommand(您定义和实现的)。
(视图绑定到的命令由视图模型实现。)
示例 - VM:
示例 - 视图:
示例 - 视图 - 代码隐藏:
In MVVM a View is binded to a View-Model which in turn is binded to a Model.
The view can not be dirty, since it's changes are reflected immediately to the View-Model.
If you want changes to be applied to Model only on "OK" or "Accept",
bind View to a View-Model that doesn't apply changes to Model,
until an ApplyCommand or AcceptCommand (that you define and implement) is executed.
(The commands that the View is binded to are implemented by the View-Model.)
Example - VM:
Example - View:
Example - view - code behind:
想法:检查实体状态:
问题是这指的是整个视图,因此当在任何编辑之前选择新参与者(刷新表单)时,该值也是“已修改”。保存后,如果没有其他变化并且我们不切换参与者,则该值为“不变”
Idea: check entitystate:
Problem is that this refers to the whole VIEW, so when a new participant (refreshes form) is selected before any editing, the value is also "Modified". After a save, if nothing else changes and we don’t switch participants, the value is "Unchanged"