c# - 如何使用 C# 中的复选框将文本框的内容更改为任何一个特殊字符?
问题描述
解释:
我有一个名为hide password的复选框和两个分别名为password和conform password的文本框。这两个文本框已经与旧密码绑定,如下所示。
Password: Apple
Conform Password: Apple
一旦我选择了隐藏密码复选框,已经在密码文本框中并符合密码文本框的旧密码应更改为 ******** 。
例如:如果我的旧密码是Apple,一旦我选中隐藏密码复选框,它应该更改为 *****,如下所示。
Password: *****
Conform password: *****
c# (wpf) 是否可以使用 MVVM?
解决方案
以下解决方案使用 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
的更改,以便在. 请注意,我们仅在不可见时才执行此操作(否则,每次击键时光标都会设置在开头,我们最终会反转密码!)Password
PasswordBox
PasswordBox
事件处理程序只要Password
在PasswordBox
.
“确认密码”的代码TextBox
非常PasswordBox
相似。
推荐阅读
- java - 用 Spock 模拟对象
- wordpress - Apache 2.4.46 (Ubuntu) mod_cache_disk Safari 问题
- authentication - 是否有与通过电子邮件向新用户发送身份验证令牌相关的 NIST 标准?
- python - 如何在 csv 导入时使用 python pandas 删除控制字符?
- neo4j - 如何查询所有公司下的员工限额?
- python - 测量生成的 3D 高斯随机场的功率谱(具有指定的功率谱)
- python - 如何使用 setWindowLongPtr (hwnd, GWL_EXSTYLE, WS_EX_NOACTIVATE)?
- python - 在 tkinter 中显示多个窗口的最佳方法是什么?
- javascript - What does this three.js program do?
- android - Android - 来电通知不振动且铃声不播放