Проверка PasswordBox при изменении текста вместо Lose Focus - PullRequest
0 голосов
/ 25 января 2012

Framework : Silverlight 4

У меня есть простой ChildWindow с именем пользователя TextBox и паролем PasswordBox.Я прикрепил обработчик событий к событию KeyDown окна.

private void onKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Escape)
        cancelButtonClick(null, null);

    if (e.Key == Key.Enter)
        okButtonClick(null, null);
}

Я пытаюсь добиться того, чтобы, когда пользователь нажимал клавишу ввода на клавиатуре, программа работала так, как будто пользовательнажал кнопку ОК.

Проблема заключается в проверке.

Поведение по умолчанию для PasswordBox в Silverlight - проверка, когда элемент управления теряет фокус.Мой PasswordBox связан с каким-то User объектом.Когда я нажимаю кнопку Enter, вызывается обработчик события, который, в свою очередь, вызывает okButtonClick(null, null).Проблема в том, что PasswordBox еще не потерял фокус в то время, поэтому свойство user.Password, к которому привязан PasswordBox, все еще пусто.

Я пытался разместитьbtnOK.Focus() до okButtonClick(null, null), но безрезультатно.

Как установить привязку, чтобы элемент управления обновлял привязку при каждом изменении текста, а не при событии LostFocus?Как правильно достичь того, что мне нужно?

Ответы [ 2 ]

5 голосов
/ 10 июля 2012

Использование события PasswordChanged для Passwordbox.
Textbox имеет TextboxChanged событие.

0 голосов
/ 26 января 2012

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

В основном оно использует присоединенное свойство для подписки на события TextChanged / PasswordChnaged, а затем в случае обновления источника привязки,После адаптации решения к моим потребностям вот что я получил (и он работает безупречно):

public class BindingHelper
{
    public static readonly DependencyProperty RefreshOnChangeProperty =
        DependencyProperty.RegisterAttached("RefreshOnChange", typeof(bool), typeof(BindingHelper),
        new PropertyMetadata(false, OnRefreshOnChangeChanged));

    public static void SetRefreshOnChange(DependencyObject o, bool value)
    {
        o.SetValue(RefreshOnChangeProperty, value);
    }

    public static bool GetRefreshOnChange(DependencyObject o)
    {
        return (bool)o.GetValue(RefreshOnChangeProperty);
    }

    private static void OnRefreshOnChangeChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
        if ((obj as TextBox) != null)
        {
            if ((bool)e.NewValue)
                (obj as TextBox).TextChanged += textBox_TextChanged;
            else
                (obj as TextBox).TextChanged -= textBox_TextChanged;
        }

        if ((obj as PasswordBox) != null)
        {
            if ((bool)e.NewValue)
                (obj as PasswordBox).PasswordChanged += passwordBox_PasswordChanged;
            else
                (obj as PasswordBox).PasswordChanged -= passwordBox_PasswordChanged;
        }
    }

    static void passwordBox_PasswordChanged(object sender, RoutedEventArgs e)
    {
        PasswordBox passwordBox = sender as PasswordBox;
        if (passwordBox != null)
        {
            BindingExpression binding = passwordBox.GetBindingExpression(PasswordBox.PasswordProperty);
            if (binding != null)
                binding.UpdateSource();
        }
    }

    static void textBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        TextBox textBox = sender as TextBox;
        if (textBox != null)
        {
            BindingExpression binding = textBox.GetBindingExpression(TextBox.TextProperty);
            if (binding != null)
                binding.UpdateSource();
        }
    }
}
...