我正在使用PasswordBox
,我想在用户在那里键入任何内容时进行检测,如果是,我需要将按钮状态更改为启用。如何检查用户是否键入任何内容在PasswordBox
?
它的行为与TextBox
不同,因为您无法将其绑定到文本当用户键入任何内容时,都会引发一些事件。知道吗?
我尝试过下面的代码,但出现错误:
<PasswordBox>
<i:Interaction.Triggers>
<EventTrigger EventName="KeyDown">
<si:InvokeDataCommand Command="{Binding MyCommand}" />
</EventTrigger>
</i:Interaction.Triggers>
</PasswordBox>
PasswordChanged
密码框中的字符串更改时触发的事件:
XAML 部分:
<PasswordBox Name="pwdBox" PasswordChanged="pwdBox_PasswordChanged" />
<Button Name="someButton" IsEnabled="False" Click="someClickEvent" />
C# 部分:
private void pwdBox_PasswordChanged(object sender, RoutedEventArgs e)
{
somebutton.IsEnabled = String.IsNullOrWhiteSpace(pwdBox.Password));
}
请注意,MSDN 说
获取 Password 属性值时,将密码公开为内存中的纯文本。若要避免此潜在的安全风险,请使用 SecurePassword 属性将密码作为安全字符串获取。
因此,以下代码可能是首选:
private void pwdBox_PasswordChanged(object sender, RoutedEventArgs e)
{
btn.IsEnabled = pwdBox.SecurePassword.Length == 0;
}
如果您只能访问 viewModel,则可以使用附加属性来创建可绑定的密码或安全密码,如本例所示
的Interactions
使用 PasswordChanged
事件:
XAML
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
<PasswordBox BorderBrush="#FFB0B1AB"
Width="100"
Height="25"
VerticalAlignment="Bottom">
<i:Interaction.Triggers>
<i:EventTrigger EventName="PasswordChanged">
<i:InvokeCommandAction Command="{Binding PasswordChangedCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</PasswordBox>
RelayCommand
private ICommand _passwordChangedCommand = null;
public ICommand PasswordChangedCommand
{
get
{
if (_passwordChangedCommand == null)
{
_passwordChangedCommand = new RelayCommand(param => this.PasswordChanged(), null);
}
return _passwordChangedCommand;
}
}
private void PasswordChanged()
{
// your logic here
}
Some useful links
PasswordBox in WPF Tutorial
Binding to PasswordBox in WPF (using MVVM)
如何在 MVVM 中绑定到密码框