我目前正在使用Silverlight 4并遵循MVVM模式。我有登录框绑定到我的ViewModel,如下所示:
<PasswordBox Password="{Binding Path=Password, Mode=TwoWay}" />
然后,我有一个绑定到Command的按钮,该按钮侦听ViewModel的 PropertyChanged 事件,当其中一个数据绑定更新其数据时,它会检查现在是否有足够的数据数据以启用“登录”按钮。
但是,PropertyChanged事件仅在用户从其中一个控件更改焦点时触发,我希望每次按键都更新模型,以便尽快启用登录按钮。
答案 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)的数据绑定在失去焦点之前不会更新,因此您必须手动更新绑定。