Silverlight 文本更改而不是失去焦点时的密码箱验证
框架:Silverlight 4 我有一个简单的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)
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);
}