C# 如何使用c中的复选框将textbox的内容更改为任何一个特殊字符?
说明: 我有一个名为hide password的复选框和两个分别名为password和conform password的文本框C# 如何使用c中的复选框将textbox的内容更改为任何一个特殊字符?,c#,wpf,mvvm,C#,Wpf,Mvvm,说明: 我有一个名为hide password的复选框和两个分别名为password和conform password的文本框 Password: Apple Conform Password: Apple Password: ***** Conform password: ***** 选择隐藏密码复选框后,密码文本框和符合密码文本框中已有的旧密码应更改为******** 例如:如果我的旧密码是Apple,只要我选中“隐藏密码”复选框,它就会更改为******,如下所示 Password:
Password: Apple
Conform Password: Apple
Password: *****
Conform password: *****
选择隐藏密码复选框后,密码文本框和符合密码文本框中已有的旧密码应更改为********
例如:如果我的旧密码是Apple,只要我选中“隐藏密码”复选框,它就会更改为******,如下所示
Password: Apple
Conform Password: Apple
Password: *****
Conform password: *****
使用MVVM的c wpf是否可能?以下解决方案使用文本框以明文形式显示密码,并使用密码框屏蔽密码。密码框位于文本框的顶部,因此首先您会看到密码被屏蔽。选中“显示密码”复选框时,密码框将隐藏,从而以纯文本显示下方的文本框和密码。以下是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>
Set方法来自ViewModelBase父类,它是mvvmlighttoolkit的一部分。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中更新它。请注意,我们仅在密码框不可见时才执行此操作,否则,光标将设置为每次击键的开头,最后密码将反转
只要密码框中的密码发生更改,事件处理程序就会简单地更新视图模型中的密码
确认密码文本框和密码框的代码非常相似。您可以通过检查是否应隐藏或显示实际文本的转换器来解决此问题。 通过使用多值转换器,我们可以传入原始文本和bool,bool指定是隐藏还是显示文本。然后,返回值为实际文本或隐藏文本:
public class PasswordToHiddenCharactersConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values.Length != 2)
{
return string.Empty;
}
var passwordText = (string)values[0];
var hidePassword = (bool)values[1];
if (hidePassword)
{
return string.Empty.PadRight(passwordText.Length, '*');
}
return passwordText;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
return new[] { value };
}
}
然后,可以在XAML中使用它绑定文本框的文本,并根据复选框的值正确显示:
<Window.Resources>
<local:PasswordToHiddenCharactersConverter x:Key="PasswordToHiddenCharactersConverter" />
</Window.Resources>
<StackPanel>
<CheckBox x:Name="HidePasswordBox" Content="Hide Password" />
<TextBox >
<TextBox.Text>
<MultiBinding Converter="{StaticResource PasswordToHiddenCharactersConverter}" UpdateSourceTrigger="PropertyChanged">
<Binding Path="Password" />
<Binding ElementName="HidePasswordBox" Path="IsChecked" />
</MultiBinding>
</TextBox.Text>
</TextBox>
</StackPanel>
Password是ViewModel中的属性名称,对于复选框,我们可以直接从xaml中绑定它,而不必通过ViewModel,但我需要c代码@David784@GJPD那不是。我已经编辑了我的问题,就我所知……有人帮帮我……为什么不使用密码箱呢?这就是它的用途。您可以设置和清除掩码,它将密码存储在安全字符串中。你被要求看到以下职位,以及完全理解我的要求@redcurry@GJPD问题应尽可能独立。如果您的问题需要扩展以充分解释您的问题,请编辑您的问题。好的……是否可以在不添加任何代码的情况下执行您所说的操作@redcurry@GJPD如果你要用密码箱就不用了。出于安全原因,它不支持数据绑定,因此我们被迫使用code behind.k…感谢您提供的信息?如果我键入密码,然后隐藏它,然后键入更多密码,则会显示第二部分,而隐藏第一部分。@redcurry您是对的,这是由于多重绑定中缺少UpdateSourceTrigger。我用这个和那个更新了代码片段,应该可以解决这个问题