C# 如何使用c中的复选框将textbox的内容更改为任何一个特殊字符?

C# 如何使用c中的复选框将textbox的内容更改为任何一个特殊字符?,c#,wpf,mvvm,C#,Wpf,Mvvm,说明: 我有一个名为hide password的复选框和两个分别名为password和conform password的文本框 Password: Apple Conform Password: Apple Password: ***** Conform password: ***** 选择隐藏密码复选框后,密码文本框和符合密码文本框中已有的旧密码应更改为******** 例如:如果我的旧密码是Apple,只要我选中“隐藏密码”复选框,它就会更改为******,如下所示 Password:

说明:

我有一个名为hide password的复选框和两个分别名为password和conform 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。我用这个和那个更新了代码片段,应该可以解决这个问题