WPF:在分离时禁用绑定更新
WPF: disable bindings update on detach
情况是这样的:我有一个编辑器应用程序,可以编辑一些分层数据。数据本身保存在 ViewModel class 中,而 View class 负责反映 ViewModel 中的变化。 View 的主要部分是 ContentControl。当 ViewModel 中的数据发生变化时,将(重新)生成控件的层次结构,并且顶级控件成为 ContentControl 的内容。当然,那些层次化的控件是有绑定的。
现在是时候关闭编辑器了。 ViewModel 对命令做出反应并清除数据。 PropertyChanged 被引发并且 View 准备好做出反应:它尝试做
myContentControl.Content = null;
但这就是陷阱所在:WPF 从 ContentControl 的可视化树中分离控件的层次结构并重新评估绑定。但是数据已经被破坏了!
我该怎么办?为什么 WPF 会更新 超出 可视化树的控件的绑定?当然我可以对空值进行额外的检查,但是有没有办法完全不对半死的控件进行绑定?
每当我们有一个 UI 使用户能够编辑对象,但也提供保存或取消的可能性时,我们只需要为该视图使用另一个视图模型 class。
因此,当编辑开始时,您将字段从当前对象复制到视图模型中的可编辑属性。然后我们让用户编辑他们想要的东西。如果他们取消操作,那么我们什么都不做,因为原始对象没有被触及。
但是,如果他们想保存,那么我们将属性从编辑后的视图模型复制到原始对象并保存。然后可以毫无后果地处理视图和视图模型。
情况是这样的:我有一个编辑器应用程序,可以编辑一些分层数据。数据本身保存在 ViewModel class 中,而 View class 负责反映 ViewModel 中的变化。 View 的主要部分是 ContentControl。当 ViewModel 中的数据发生变化时,将(重新)生成控件的层次结构,并且顶级控件成为 ContentControl 的内容。当然,那些层次化的控件是有绑定的。 现在是时候关闭编辑器了。 ViewModel 对命令做出反应并清除数据。 PropertyChanged 被引发并且 View 准备好做出反应:它尝试做
myContentControl.Content = null;
但这就是陷阱所在:WPF 从 ContentControl 的可视化树中分离控件的层次结构并重新评估绑定。但是数据已经被破坏了!
我该怎么办?为什么 WPF 会更新 超出 可视化树的控件的绑定?当然我可以对空值进行额外的检查,但是有没有办法完全不对半死的控件进行绑定?
每当我们有一个 UI 使用户能够编辑对象,但也提供保存或取消的可能性时,我们只需要为该视图使用另一个视图模型 class。
因此,当编辑开始时,您将字段从当前对象复制到视图模型中的可编辑属性。然后我们让用户编辑他们想要的东西。如果他们取消操作,那么我们什么都不做,因为原始对象没有被触及。
但是,如果他们想保存,那么我们将属性从编辑后的视图模型复制到原始对象并保存。然后可以毫无后果地处理视图和视图模型。