-1

我在 CRUD 表单中遇到了一些困难。我们有一个保存表单的按钮,并将 IsDefault 标志设置为 true,以便用户可以随时按 Enter 键来保存表单。

问题是当用户在文本框中输入并按下回车键时,文本框绑定的源不会更新。我知道这是因为UpdateSourceTrigger文本框的默认功能是LostFocus,在某些情况下我用它来解决问题,但在其他情况下这实际上会导致更多问题。

对于标准string字段,这很好,但是对于像doubles 和s 这样的东西,验证发生在属性更改时,因此阻止用户在绑定到双源的文本框中int输入 say (他们可以输入 1,但验证会停止1.5十进制,他们可以键入15然后将光标移回并按下.)。

有没有更好的方法来解决这个问题?我查看了在代码中刷新窗口中所有绑定的方法,该代码提出了触发PropertyChanged事件,string.empty但是这只会刷新目标,而不是源。

4

2 回答 2

2

当我不想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" />
于 2013-05-15T12:34:36.457 回答
0

您可以使用以下代码更新绑定源:

textBox1.GetBindingExpression(TextBox.TextProperty).UpdateSource();
于 2013-05-15T12:25:32.573 回答