【问题标题】:Update Dependency Property prior to program exit在程序退出之前更新依赖属性
【发布时间】:2010-09-13 06:31:27
【问题描述】:

我在 RichTextBox 上创建了 Binary 类型的依赖属性,它允许我绑定到 ViewModel 中二进制形式 (byte[]) 的 FlowDocument。这很好用,属性可以正确转换和返回。

只要 RichTextBox 失去焦点,依赖属性的值就会使用 FlowDocument 的新二进制表示进行更新。

我的问题是,如果我一直在使用 RichTextBox 并关闭窗口,RichTextBox 不会失去焦点,因此依赖属性不会使用 FlowDocument 的新二进制表示进行更新,因此不会提交新的更改数据库。在我的 ViewModel 中,我有一个 CleanUp 方法,当 ViewModel 准备好被释放时会调用它,我可以在其中保存更新的文档。

如果用户单击关闭窗口,RichTextBox 不会失去焦点,如何让依赖属性更新自身? 我集思广益:

  1. 通过消息广播告诉依赖属性更新自己。我不清楚如何在依赖属性中注册消息监听器。
  2. 直接查询RichTextBox,获取Document,手动转换成二进制对象。
  3. 让视图将焦点移至虚拟控件,以便依赖属性现在自行更新。

你们觉得呢?

更新:依赖属性的 on changed 事件添加了一个事件处理程序,该处理程序正在等待 RichTextBox 失去焦点。正是这个处理程序用它的新值来更新依赖。

【问题讨论】:

    标签: wpf mvvm dependency-properties mvvm-light


    【解决方案1】:

    使用“PropertyChanged”的 UpdateSourceTrigger

    类似:

    {Binding Path=MyProperty, 
                        Mode=TwoWay,
                        UpdateSourceTrigger=PropertyChanged}
    

    【讨论】:

    • 这意味着对于 RichTextBox 中的每一个小变化,都需要创建一个表示二进制 FlowDocument 的新对象并将其设置为 BinaryFlowDocument 依赖属性的值。我也尝试了上述方法,但依赖属性从未更新,除非焦点实际上丢失了。
    • 如果我直接绑定到 RichTextBox 的 Document 属性,这可能是可行的方法。
    • 那么您将视图模型绑定到什么?我们将我们的视图模型绑定到上面的控件,它很有效。
    • 我正在绑定到我创建的 BinaryFlowDocument 的依赖属性。 RichTextBox 已扩展为包含此属性。
    【解决方案2】:

    我曾经遇到过类似的问题,我使用的解决方案是将焦点移到另一个控件上,我从来没有遇到过任何问题。

    在我的例子中,窗口中有几个可编辑的控件,所以我不必使用虚拟控件。

    【讨论】:

    【解决方案3】:

    是什么阻止您处理 Window 的关闭/关闭事件以及移动焦点或更新绑定?

    【讨论】:

      猜你喜欢
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多