【发布时间】:2013-07-24 07:35:59
【问题描述】:
我有一个应用程序和一个设置窗口,其中包含几个 TabItem 的 TabControl。它们中的每一个都有一些字段(文本框),这些字段(文本框)被数据绑定到同一个 Singleton 对象。
仅在单击“保存”按钮后,是否有任何优雅且类似于 WPF 的数据绑定方式?
现在它在更改文本框的内容后立即进行数据绑定,我希望该单例具有旧值并仅在单击保存按钮后更新它们。
【问题讨论】:
标签: wpf data-binding
我有一个应用程序和一个设置窗口,其中包含几个 TabItem 的 TabControl。它们中的每一个都有一些字段(文本框),这些字段(文本框)被数据绑定到同一个 Singleton 对象。
仅在单击“保存”按钮后,是否有任何优雅且类似于 WPF 的数据绑定方式?
现在它在更改文本框的内容后立即进行数据绑定,我希望该单例具有旧值并仅在单击保存按钮后更新它们。
【问题讨论】:
标签: wpf data-binding
对于您在 XAML 中用于 Textbox 的 DataBinding 对象,请使用值为 Explicit 的 UpdateSourceTrigger 属性,如下所示:
<TextBox Name="itemNameTextBox"
Text="{Binding Path=ItemName, UpdateSourceTrigger=Explicit}" />
当您将 UpdateSourceTrigger 值设置为 Explicit 时,源值仅在应用程序调用以下 UpdateSource 方法时才会更改(您可以将以下代码放入 Save Click 事件中):
BindingExpression be = itemNameTextBox.GetBindingExpression(TextBox.TextProperty);
be.UpdateSource();
【讨论】:
不要在每个属性的集合上引发更改通知(因为这是触发重新绑定和更新的原因),而是将所有引发通知放在保存按钮中。然后,当您单击保存时,您保存并告诉视图重新绑定到那些(现在设置的)属性。
进一步: 绑定到非单例属性(因为您希望在单击保存之前保留旧设置)- 这些属性没有引发通知。
在您的保存按钮中,设置您的单例属性,然后引发其他属性的所有通知。
在您的取消按钮中,将您的其他属性设置为单例属性的值,并引发所有通知。
不要忘记在第一次加载视图时将属性设置为单例属性,并引发所有通知(就像取消一样)。
【讨论】:
如果您使用 WPF,请将 UpdateSourceTrigger 更改为 LostFocus。我认为这将解决目的。
Text="{Binding Path=MyText, UpdateSourceTrigger=LostFocus, Mode=TwoWay}"
【讨论】: