刷新所有绑定的目标
本文关键字:目标 绑定 刷新 | 更新日期: 2023-09-27 18:13:34
我在CRUD表单中遇到了一点困难。我们有一个保存表单的按钮,并将IsDefault标志设置为true,这样用户就可以在任何时候按enter键保存表单。
问题是,当用户在文本框中输入并按enter键时,文本框绑定的源没有更新。我知道这是因为文本框的默认UpdateSourceTrigger
功能是LostFocus
,在某些情况下我已经用它来克服这个问题,但这实际上在其他情况下会导致更多的问题。
对于标准的string
字段,这是很好的,但是对于像double
s和int
s这样的事情,验证发生在属性更改上,因此阻止用户在绑定到双源的文本框中输入1.5
(他们可以键入1,但验证停止小数,他们可以键入15
然后将光标移回并按下.
)。
有更好的方法来处理这个问题吗?我研究了在代码中刷新窗口中所有绑定的方法,这些方法产生了用string.empty
触发PropertyChanged
事件,但是这只刷新目标,而不是源。
当我不想在绑定上设置UpdateSourceTrigger=PropertyChanged
时,我的标准解决方案是使用自定义AttachedProperty
,当设置为true时,将在Enter按下时更新绑定源。
这是我的附加属性的副本
// When set to True, Enter Key will update Source
#region EnterUpdatesTextSource DependencyProperty
// Property to determine if the Enter key should update the source. Default is False
public static readonly DependencyProperty EnterUpdatesTextSourceProperty =
DependencyProperty.RegisterAttached("EnterUpdatesTextSource", typeof (bool),
typeof (TextBoxHelper),
new PropertyMetadata(false, EnterUpdatesTextSourcePropertyChanged));
// Get
public static bool GetEnterUpdatesTextSource(DependencyObject obj)
{
return (bool) obj.GetValue(EnterUpdatesTextSourceProperty);
}
// Set
public static void SetEnterUpdatesTextSource(DependencyObject obj, bool value)
{
obj.SetValue(EnterUpdatesTextSourceProperty, value);
}
// Changed Event - Attach PreviewKeyDown handler
private static void EnterUpdatesTextSourcePropertyChanged(DependencyObject obj,
DependencyPropertyChangedEventArgs e)
{
var sender = obj as UIElement;
if (obj != null)
{
if ((bool) e.NewValue)
{
sender.PreviewKeyDown += OnPreviewKeyDownUpdateSourceIfEnter;
}
else
{
sender.PreviewKeyDown -= OnPreviewKeyDownUpdateSourceIfEnter;
}
}
}
// If key being pressed is the Enter key, and EnterUpdatesTextSource is set to true, then update source for Text property
private static void OnPreviewKeyDownUpdateSourceIfEnter(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
if (GetEnterUpdatesTextSource((DependencyObject) sender))
{
var obj = sender as UIElement;
BindingExpression textBinding = BindingOperations.GetBindingExpression(
obj, TextBox.TextProperty);
if (textBinding != null)
textBinding.UpdateSource();
}
}
}
#endregion //EnterUpdatesTextSource DependencyProperty
它是这样使用的:
<TextBox Text="{Binding SomeText}" local:EnterUpdatesTextSource="True" />
您可以使用以下代码更新绑定源:
textBox1.GetBindingExpression(TextBox.TextProperty).UpdateSource();