4

MSDN 文档指出:

TwoWay 或 OneWayToSource 的绑定侦听目标属性中的更改并将它们传播回源。这称为更新源。通常,只要目标属性更改,就会发生这些更新。这适用于复选框和其他简单控件,但通常不适用于文本字段。每次击键后更新可能会降低性能,并且它会剥夺用户在提交新值之前退格和修复打字错误的通常机会。因此,Text 属性的默认 UpdateSourceTrigger 值是 LostFocus 而不是 PropertyChanged。

我了解,在更新直接进入数据库或通过网络,或者数据量非常大的情况下,在 TextBoxes 上使用 UpdateSourceTrigger = PropertyChanged 确实会降低性能。

但是,如果它只是更新一个简单的 DependencyProperty,或者一个实体框架对象的属性(在提交之前),那么性能损失是否可以忽略不计?

只是想知道,因为我正在创建一个 WPF 应用程序,它跟踪正在编辑的对象的状态,并根据是否进行了更改来优化“保存”按钮的外观。我认为确定更改的最简单方法是酌情捕获相关的 SourceUpdated 事件。当文本框的 UpdateSourceTrigger = PropertyChanged 时,它的工作效果最佳,因为用户会立即获得“可保存”更改的反馈。

4

2 回答 2

1

如果它适合您的应用程序并且您没有注意到性能显着下降,那么UpdateSourceTriggerPropertyChanged. 事实上,如果您使用的是 MVVM 框架,例如Caliburn.Micro,那么它将将此设置为所有 TextBox 的默认设置。

于 2011-06-30T09:06:11.213 回答
1

警告您性能下降的原因是,在大多数情况下,如果您需要在每次击键时更新源属性,那是因为您需要在属性值更改时发生一些事情。毕竟,如果您不需要发生那种“事情”,那么您就不会真正关心属性何时更新,只要它最终更新即可。

对性能的真正影响完全取决于那个“东西”是什么。这完全取决于您的应用程序。如果那个“东西”正在格式化并在另一个中显示值TextBlock,那么在每次击键时都这样做可能不会引起注意。如果它正在过滤 10,000 行DataTable并刷新DataGrid绑定到它,它可能会。

那你怎么讲?嗯,有两种方法:

1) 了解您的应用程序。如果您在更新源属性时知道应用程序在做什么,那么您可以预测是否在每次击键时都执行此操作会成为问题。当你说“我想我想知道一开始它是否看起来很好,但实际上会在我不知道的某些情况下引起问题”,你真正想说的是,“如果我不这样做会发生什么”不知道用户按键时我的应用程序在做什么?”

2) 如果您不知道用户按下某个键时您的应用程序在做什么,请对其进行分析。

于 2011-06-30T18:08:35.423 回答