【发布时间】:2011-06-08 08:10:42
【问题描述】:
假设我有一个带有文本框和确定/取消按钮的模式对话框。它是建立在 MVVM 之上的——即它有一个 ViewModel 对象,该对象带有一个文本框绑定到的字符串属性。
假设我在文本框中输入了一些文本,然后抓住鼠标并单击“确定”。一切正常:在单击的那一刻,文本框失去焦点,这导致绑定引擎更新 ViewModel 的属性。我得到了我的数据,大家都很高兴。
现在假设我不使用鼠标。相反,我只是在键盘上点击Enter。这也会导致“确定”按钮“单击”,因为它被标记为IsDefault="True"。但猜猜怎么了?在这种情况下,文本框不会失去焦点,因此绑定引擎仍然天真无知,我没有得到我的数据。该死!
同一场景的另一个变体:假设我在主窗口中有一个数据输入表单,在其中输入一些数据,然后点击Ctrl+S 进行“保存”。你猜怎么了?我的最新条目没有保存!
这可以通过使用UpdateSourceTrigger=PropertyChanged在某种程度上解决,但这并不总是可行的。
一个明显的例子是将StringFormat 与绑定一起使用——当我尝试输入文本时,文本不断跳回到“格式化”状态。
我自己遇到的另一种情况是,当我在视图模型的属性设置器中进行一些耗时的处理时,我只想在用户“完成”输入文本时执行它。
这似乎是一个永恒的问题:我记得很久以前就尝试系统地解决它,自从我开始使用交互式界面以来,但我从未完全成功。过去,我总是最终使用某种技巧——比如,为每个“演示者”(如“MVP”)添加一个“EnsureDataSaved”方法,并在“关键”点调用它,或者类似的东西。 ..
但鉴于 WPF 的所有酷技术以及空洞的炒作,我预计他们会提出一些好的解决方案。
【问题讨论】:
标签: c# wpf data-binding binding datasource