2

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

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

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

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

4

2 回答 2

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>

现在属性密码将随着用户类型而更新。

于 2010-02-18T00:55:03.650 回答
0

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

于 2010-02-18T00:32:38.790 回答