首页 > 解决方案 > 如何使用 C# 中的复选框将文本框的内容更改为任何一个特殊字符?

问题描述

解释:

我有一个名为hide password的复选框和两个分别名为passwordconform password的文本框。这两个文本框已经与旧密码绑定,如下所示。

Password: Apple
Conform Password: Apple

一旦我选择了隐藏密码复选框,已经在密码文本框中并符合密码文本框的旧密码应更改为 ******** 。

例如:如果我的旧密码Apple,一旦我选中隐藏密码复选框,它应该更改为 *****,如下所示。

Password: *****
Conform password: *****

c# (wpf) 是否可以使用 MVVM?

标签: c#wpfmvvm

解决方案


以下解决方案使用 aTextBox以纯文本形式显示密码并使用 aPasswordBox来屏蔽密码。位于PasswordBox顶部TextBox,所以起初您会看到密码被屏蔽。当检查“显示密码”复选框时,将PasswordBox隐藏起来,从而显示TextBox下方(以及纯文本中的密码)。这是 XAML:

<Window.Resources>
    <BooleanToVisibilityConverter x:Key="VisibilityConverter" />
</Window.Resources>

<StackPanel>
    <Grid>
        <TextBox
            Text="{Binding Password, UpdateSourceTrigger=PropertyChanged}"
            />
        <PasswordBox
            x:Name="PasswordBox"
            PasswordChanged="OnPasswordChanged"
            Visibility="{Binding HidePassword, Converter={StaticResource VisibilityConverter}}"
            />
    </Grid>
    <CheckBox
        Content="Show password"
        IsChecked="{Binding ShowPassword}"
        />
</StackPanel>

它不会对所有事情都使用 MVVM(注意OnPasswordChanged事件处理程序)。这是因为PasswordBox不能使用绑定,所以必须在代码隐藏中设置密码。但在展示之前,这是视图模型:

public class ViewModel : ViewModelBase
{
    private string _password;
    public string Password
    {
        get => _password;
        set => Set(ref _password, value);
    }

    private bool _showPassword;
    public bool ShowPassword
    {
        get => _showPassword;
        set
        {
            Set(ref _showPassword, value);
            RaisePropertyChanged(nameof(HidePassword));
        }
    }

    public bool HidePassword => !ShowPassword;
}

这些Set方法来自ViewModelBase父类,它是 MVVM Light Toolkit 的一部分。该Set方法只是设置属性的支持字段并引发该PropertyChanged属性的事件。

最后,这是后面的代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        InitializeViewModel();
    }

    public ViewModel ViewModel => DataContext as ViewModel;

    private void InitializeViewModel()
    {
        DataContext = new ViewModel();

        ViewModel.PropertyChanged += (sender, args) =>
        {
            // Update the password box only when it's not visible;
            // otherwise, the cursor goes to the beginning on each keystroke
            if (!PasswordBox.IsVisible)
            {
                if (args.PropertyName == nameof(ViewModel.Password))
                    PasswordBox.Password = ViewModel.Password;
            }
        };
    }

    private void OnPasswordChanged(object sender, RoutedEventArgs e)
    {
        ViewModel.Password = PasswordBox.Password;
    }
}

将 设置DataContext为新的 后,我们会监听属性ViewModel的更改,以便在. 请注意,我们仅在不可见时才执行此操作(否则,每次击键时光标都会设置在开头,我们最终会反转密码!)PasswordPasswordBoxPasswordBox

事件处理程序只要PasswordPasswordBox.

“确认密码”的代码TextBox非常PasswordBox相似。


推荐阅读