Prism + MVVM + ключи доступа + UpdateSourceTrigger = "LostFocus" - это не позволяет мне сохранять обновленное текстовое поле без потери фокуса - PullRequest
1 голос
/ 10 ноября 2011

Не совсем уверен, как решить эту проблему:

У меня есть кнопка «Сохранить», к которой прикреплены ключи доступа ... но, если я наберу что-нибудь в текстовое поле и нажму клавиши доступа, чтобысохранить, текстовое поле не обновляет мою viewmodel, потому что он никогда не терял фокус.Есть ли способ решить эту проблему, кроме изменения UpdateSourceTrigger на PropertyChanged?

1 Ответ

1 голос
/ 14 ноября 2011

Ваша проблема: UpdateSourceTrigger="LostFocus"

Это значение по умолчанию для TextBox и означает, что TextBox будет обновлять свое связанное значение только тогда, когда теряет фокус

Один из способов заставить его обновитьбез установки UpdateSourceTrigger="PropertyChanged" означает подключение к событию KeyPress, и если комбинация клавиш является чем-то, что вызовет сохранение, вызовите UpdateSource() first

Вот присоединенное свойство, которое мне нравится использовать, когда клавиша Enter должна обновитьисточник.

Используется так:

<TextBox Text="{Binding Name}" 
         local:TextBoxProperties.EnterUpdatesTextSource="True" />

, а определение присоединенного свойства выглядит следующим образом:

public class TextBoxProperties
{
    public static readonly DependencyProperty EnterUpdatesTextSourceProperty =
        DependencyProperty.RegisterAttached("EnterUpdatesTextSource", typeof(bool), typeof(TextBoxProperties), 
            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 += OnPreviewKeyDown_UpdateSourceIfEnter;
            }
            else
            {
                sender.PreviewKeyDown -= OnPreviewKeyDown_UpdateSourceIfEnter;
            }
        }
    }

    // If key being pressed is the Enter key, and EnterUpdatesTextSource is set to true, then update source for Text property
    private static void OnPreviewKeyDown_UpdateSourceIfEnter(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();
            }
        }
    }
}
...