Как сделать так, чтобы привязка данных Silverlight обновляла модель по мере ввода пользователем данных? - PullRequest
2 голосов
/ 18 февраля 2010

В настоящее время я использую Silverlight 4 и следую шаблону MVVM.У меня есть поля для входа, привязанные к моей ViewModel следующим образом:

<PasswordBox Password="{Binding Path=Password, Mode=TwoWay}" />

Затем у меня есть кнопка, связанная с командой, которая прослушивает событие ViewModel PropertyChanged и когда одна из привязок данныхобновив свои данные, он проверяет, достаточно ли сейчас данных для включения кнопки входа в систему.

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

Ответы [ 2 ]

5 голосов
/ 18 февраля 2010

Создать поведение:

public class UpdateSourceOnPasswordChanged : Behavior<PasswordBox>
{
    protected override void OnAttached()
    {
        base.OnAttached();

        AssociatedObject.PasswordChanged += OnPasswordChanged;
    }

    private void OnPasswordChanged(object sender, RoutedEventArgs e)
    {
        var binding = AssociatedObject.GetBindingExpression(PasswordBox.PasswordProperty);
        binding.UpdateSource();
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();

        AssociatedObject.PasswordChanged -= OnPasswordChanged;
    }
}

И измените свой xaml:

<PasswordBox Password="{Binding Password, Mode=TwoWay}">
    <i:Interaction.Behaviors>
        <local:UpdateSourceOnPasswordChanged/>
    </i:Interaction.Behaviors>
</PasswordBox>

Теперь свойство Password будет обновляться по мере ввода типов пользователей.

0 голосов
/ 18 февраля 2010

Я бы рекомендовал использовать поведение, которое прослушивает событие OnBeyDown PasswordBox и оттуда запускает событие вашего ViewModel (или запускает какой-то другой фрагмент пользовательского кода, который вы хотите присоединить к событию PropertyChanged). Привязка данных для TextBox и их производных (таких как PasswordBox) не обновляется, пока они не потеряют фокус, поэтому вам придется вручную обновлять привязку.

...