Silverlight 文本更改而不是失去焦点时的密码箱验证

Silverlight 文本更改而不是失去焦点时的密码箱验证,silverlight,validation,binding,focus,keydown,Silverlight,Validation,Binding,Focus,Keydown,框架: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)

框架: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);
}
我试图实现的是,当用户按下键盘上的Enter键时,程序的行为就像用户单击了OK按钮一样

问题在于验证

Silverlight的PasswordBox的默认行为是在控件失去焦点时执行验证。我的
密码箱
绑定到某个
用户
对象。当我单击Enter按钮时,事件处理程序被调用,而事件处理程序又调用
okButtonClick(null,null)
。问题是,
PasswordBox
当时还没有失去焦点,因此
PasswordBox
绑定到的
user.Password
属性仍然是空的

我试图将
btnOK.Focus()
放在
ok按钮单击(null,null)
之前,但没有效果


如何设置绑定,以便控件在每次文本更改时更新绑定,而不是在
LostFocus
事件上更新绑定?实现我所需的正确方法是什么?

我跌跌撞撞地解决了这个问题

它基本上使用attached属性来订阅TextChanged/PasswordChnaged事件,然后在事件中更新绑定源。在适应了我的需求后,我得到了以下结果(它工作得非常完美):


我结结巴巴地解决了这个问题

它基本上使用attached属性来订阅TextChanged/PasswordChnaged事件,然后在事件中更新绑定源。在适应了我的需求后,我得到了以下结果(它工作得非常完美):


使用
PasswordChanged
事件处理
Passwordbox


Textbox
具有
TextboxChanged
事件。

Passwordbox
使用
PasswordChanged
事件
private void onKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Escape)
        cancelButtonClick(null, null);

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

Textbox
已更改了
Textbox
事件。

您是否考虑过使用密码箱创建双向绑定的DependencyProperty?因此,当您触发事件“onKeyDown”时,您可以在方法内部使用某种验证。我不太清楚您的意思。PasswordBox的Password属性已经绑定到我的用户对象(显然是双向模式),但是除非PasswordBox失去焦点,否则不会分配该值。我可以在onKeyDown处理程序中手动设置值,但这会使本例中的绑定无效,因为首先使用绑定的动机是自动进行此类更改。您是否考虑过使用PasswordBox创建一个以双向模式绑定的DependencyProperty?因此,当您触发事件“onKeyDown”时,您可以在方法内部使用某种验证。我不太清楚您的意思。PasswordBox的Password属性已经绑定到我的用户对象(显然是双向模式),但是除非PasswordBox失去焦点,否则不会分配该值。我可以在onKeyDown处理程序中手动设置这些值,但这会使本例中的绑定变得无用,因为首先使用绑定的动机是使这些更改自动进行。
private void onKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Escape)
        cancelButtonClick(null, null);

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