C# 如果用户在WPF中键入任何内容,请选中PasswordBox

C# 如果用户在WPF中键入任何内容,请选中PasswordBox,c#,wpf,mvvm,passwords,passwordbox,C#,Wpf,Mvvm,Passwords,Passwordbox,我使用的是PasswordBox,我想检测用户在那里键入的任何内容,如果是,我需要将按钮状态更改为enabled。如何检查用户是否键入了任何内容 在密码框中 它的行为与TextBox不同,因为您无法将其绑定到文本 当用户键入任何内容时,都会引发一些事件。有什么想法吗 我已尝试使用以下代码,但出现错误: <PasswordBox> <i:Interaction.Triggers> <EventTrigger EventName="KeyDown

我使用的是
PasswordBox
,我想检测用户在那里键入的任何内容,如果是,我需要将按钮状态更改为enabled。如何检查用户是否键入了任何内容 在
密码框中

它的行为与
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" />
请注意,MSDN表示

当您获得Password属性值时,您将在内存中以纯文本形式公开密码。要避免这种潜在的安全风险,请使用SecurePassword属性将密码作为SecureString获取

因此,以下代码可能是首选代码:

    private void pwdBox_PasswordChanged(object sender, RoutedEventArgs e)
    {
        if (pwdBox.SecurePassword.Length == 0)
        {
            btn.IsEnabled = false;
        }
        else
        {
            btn.IsEnabled = true;
        }
    }
如果您只能访问viewModel,则可以使用附加属性创建可绑定密码或securepassword,因为您可以通过
交互使用事件,如下所示:

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>
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
}
一些有用的链接

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>
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
}


谢谢mcy+1,问题是我没有查看模型视图的实例,有一种方法可以在模型视图本身中调用此事件?您可以看到我尝试更新问题这是一个很好的答案。这比公认的答案要简单得多。此外,如果默认情况下该按钮处于启用状态,则可以在代码隐藏构造函数中添加调用:pwdBox_PasswordChanged(“,new RoutedEventArgs()”),并假设pwdBox为空(应该为空),则在页面打开时将其设置为未启用。