Заменить символы в TextBox для ввода пароля C# WPF MVVM

135
30 декабря 2020, 07:40

Так исторически сложилось, что необходимо использовать TextBox для ввода логина и пароля. Как правильно организовать замену символов в текстовом поле ввода пароля. Набросал код.

public class TextToPasswordCharConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var str = new string('*', value?.ToString().Length ?? 0);
        return str;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        //throw new NotImplementedException();
        return new object();
    }
}

Свойство пароля во вью модели

public string PasswordField
    {
        get => passwordValue;
        set
        {
            passwordValue = value;
            OnPropertyChanged();
        }
    }

Наблюдатель

 public abstract class NotificationObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    protected void SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
    {
        if (!EqualityComparer<T>.Default.Equals(field, value))
        {
            field = value;
            OnPropertyChanged(propertyName);
        }
    }
}

Разметка

    <TextBox Grid.Row="0" Grid.Column="0" TextWrapping="Wrap" Margin="140,174,30,10">
        <TextBox.Text>
            <Binding Path="PasswordField" ValidatesOnDataErrors="True" Converter="{StaticResource TextToPasswordCharConverter}" UpdateSourceTrigger="PropertyChanged">
                <Binding.ValidationRules>
                    <ExceptionValidationRule />
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>

Код работает, но вопрос в том, что не знаю как правильно реализовать конвертер. Сейчас он при вводе одного символа пишет в поле 13 символов сразу '' и удалить их не возможно клавишей backSpace. А необходимо при вводе символа печатать в текстовое поле всегда символ '', и возможность его стирать.

Answer 1

Сделал немного проще. Скачал шрифт passdot.ttf. Добавил его в ресурсы приложения, подключил в разметке,

FontFamily="pack://application:,,,/Resources/#password"

где запретил копирование, вырезание и вставку.

  <TextBox Grid.Row="0" Grid.Column="0" VerticalContentAlignment="Center" 
             TextWrapping="Wrap" Margin="140,174,30,10" 
             FontFamily="pack://application:,,,/Resources/#password"
             CommandManager.PreviewExecuted="OnPreviewExecuted"
             ContextMenu="{x:Null}">
        <TextBox.Text>
            <Binding Path="PasswordField" ValidatesOnDataErrors="True" UpdateSourceTrigger="PropertyChanged">
                <Binding.ValidationRules>
                    <ExceptionValidationRule />
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
        <TextBox.InputBindings>
            <!--Disable CTRL+C -->
            <KeyBinding Command="ApplicationCommands.NotACommand"
                        Key="C"
                        Modifiers="Control" />
        </TextBox.InputBindings>
    </TextBox>

Пока для теста во вью прокинул событие, после заменю на команду.

/// <summary>
    ///     Forbid Copy, Cut, Paste
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void OnPreviewExecuted(object sender, ExecutedRoutedEventArgs e)
    {
        if (e.Command == ApplicationCommands.Copy ||
            e.Command == ApplicationCommands.Cut ||
            e.Command == ApplicationCommands.Paste)
            e.Handled = true;
    }

С password box пока заморачиваться не стал. Дальше захеширую строку в поле. Что бы в памяти текст не хранить.

READ ALSO
Unity сцена внутри картинки

Unity сцена внутри картинки

У меня есть картинка для экрана игры, но она с полями (счет, уровень и тп)

108
XML файл при чтении выдаёт ошибку

XML файл при чтении выдаёт ошибку

Пытаюсь прочитать XML файл

133
Как удалить привязки DataGridViewComboBoxCell из dataGridView?

Как удалить привязки DataGridViewComboBoxCell из dataGridView?

Нужно сделать сброс dataGridView1 в начальное состояние, те удалить все строки и вставить новые изначальные

125