如何在用户键入时使用Silverlight数据绑定更新模型?

时间:2010-02-17 22:45:40

标签: silverlight data-binding mvvm silverlight-4.0 command-pattern

我目前正在使用Silverlight 4并遵循MVVM模式。我有登录框绑定到我的ViewModel,如下所示:

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

然后,我有一个绑定到Command的按钮,该按钮侦听ViewModel的 PropertyChanged 事件,当其中一个数据绑定更新其数据时,它会检查现在是否有足够的数据数据以启用“登录”按钮。

但是,PropertyChanged事件仅在用户从其中一个控件更改焦点时触发,我希望每次按键都更新模型,以便尽快启用登录按钮。

2 个答案:

答案 0 :(得分:5)

创建行为:

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>

现在,属性密码将更新为用户类型。

答案 1 :(得分:0)

我建议使用侦听PasswordBox的OnKeyDown事件的行为,并从那里触发ViewModel的事件(或者运行您想要附加到PropertyChanged事件的其他一些自定义代码)。 TextBoxes及其派生词(如PasswordBox)的数据绑定在失去焦点之前不会更新,因此您必须手动更新绑定。