Подтвердить что ты не робот

Как я могу сделать TextBox "полем пароля" и отображать звезды при использовании MVVM?

Как это сделать в XAML:

псевдокод:

<TextBox Text="{Binding Password}" Type="Password"/>

чтобы пользователь видел звезды или точки, когда он вводит пароль.

Я пробовал различные примеры, которые предлагают PasswordChar и PasswordBox, но могут" t заставить их работать.

например. Я могу сделать это, как показано здесь:

<PasswordBox Grid.Column="1" Grid.Row="1"
    PasswordChar="*"/>

но я, конечно, хочу привязать свойство Text к моему ViewModel, чтобы я мог отправить значение связанного TextBox при нажатии кнопки (не работая с кодом позади), я хочу сделать это:

<TextBox Grid.Column="1" Grid.Row="0" 
    Text="{Binding Login}" 
    Style="{StaticResource FormTextBox}"/>
<PasswordBox Grid.Column="1" Grid.Row="1"
    Text="{Binding Password}" 
    PasswordChar="*"
    Style="{StaticResource FormTextBox}"/>

Но PasswordBox не имеет свойства Text.

4b9b3361

Ответ 1

Чтобы получить или установить пароль в PasswordBox, используйте свойство Password. Например,

string password = PasswordBox.Password;

Это не поддерживает привязку данных, насколько я знаю, поэтому вам нужно будет установить значение в коде и обновить ее соответствующим образом.

Ответ 2

Отправьте элемент управления паролем в качестве параметра в свою команду входа.

<Button Command="{Binding LoginCommand}" CommandParameter="{Binding ElementName=PasswordBox}"...>

Затем вы можете вызвать CType(parameter, PasswordBox).Password в своей модели просмотра.

Ответ 4

Спасибо Коди, это было очень полезно. Я просто добавил пример для парней, использующих команду Delegate в С#

<PasswordBox x:Name="PasswordBox"
             Grid.Row="1" Grid.Column="1"
             HorizontalAlignment="Left" 
             Width="300" Height="25"
             Margin="6,7,0,7" />
<Button Content="Login"
        Grid.Row="4" Grid.Column="1"
        Style="{StaticResource StandardButton}"
        Command="{Binding LoginCommand}"
        CommandParameter="{Binding ElementName=PasswordBox}"
        Height="31" Width="92"
        Margin="5,9,0,0" />

 

public ICommand LoginCommand
{
   get
   {
        return new DelegateCommand<object>((args) =>
        {
            // Get Password as Binding not supported for control-type PasswordBox
            LoginPassword = ((PasswordBox) args).Password;

            // Rest of code here
        });
   }
}

Ответ 5

Вы можете сделать свой TextBox как пользовательский PasswordBox, просто добавив следующее значение в свойство FontFamily вашего элемента управления TextBox.

<TextBox
    Text="{Binding Password}"
    FontFamily="ms-appx:///Assets/PassDot.ttf#PassDot"
    FontSize="35"/>

В моем случае это работает отлично. Это покажет точку вместо фактического текста (но не звезды (*), хотя).

Ответ 6

Как отметил Тасним Фабиха, можно изменить шрифт для TextBox, чтобы показывать только точки/звездочки. Но я не смог найти его шрифт... поэтому я приведу свой рабочий пример:

<TextBox Text="{Binding Password}" 
     FontFamily="pack://application:,,,/Resources/#password" />

Просто копирование-вставка не сработает. Во-первых, вы должны скачать указанный шрифт "password.ttf" ссылка: https://github.com/davidagraf/passwd/blob/master/public/ttf/password.ttf Затем скопируйте его в папку ресурсов вашего проекта (Project-> Свойства → Resources-> Добавить resource-> Добавить существующий файл). Затем установите для этого параметра Build Action: Resource.

После этого вы увидите только точки, но вы все равно можете скопировать текст из них, поэтому необходимо отключить сочетание клавиш CTRL + C следующим образом:

<TextBox Text="{Binding Password}" 
     FontFamily="pack://application:,,,/Resources/#password" > 
    <TextBox.InputBindings>
        <!--Disable CTRL+C -->
        <KeyBinding Command="ApplicationCommands.NotACommand"
            Key="C"
            Modifiers="Control" />
    </TextBox.InputBindings>
</TextBox>

Ответ 7

Я сделал следующее из кода Viewsbehind, чтобы установить мое свойство в модели представления. Не уверен, действительно ли это "разрывает" шаблон MVVM, но его лучшее и наименее сложное решение найдено.

  var data = this.DataContext as DBSelectionViewModel;

        data.PassKey = txtPassKey.Password;

Ответ 8

Проблема с использованием PasswordBox заключается в том, что он не очень дружественен к MVVM из-за того, что он работает с SecureString и поэтому для его привязки к String требуется прокладка. Вы также не можете использовать буфер обмена. Несмотря на то, что все эти причины существуют, вам может не потребоваться такой уровень безопасности. Вот альтернативный подход, который работает с буфером обмена, ничего особенного. Вы делаете текст TextBox и фон прозрачным и привязываете текст к TextBlock под ним. Этот текстовый блок преобразует символы в *, используя указанный конвертер.

<Window.Resources>
    <local:TextToPasswordCharConverter x:Key="TextToPasswordCharConverter" />
</Window.Resources>

<Grid Width="200">
    <TextBlock Margin="5,0,0,0" Text="{Binding Text, Converter={StaticResource TextToPasswordCharConverter}, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" FontFamily="Consolas" VerticalAlignment="Center" />
    <TextBox Foreground="Transparent" Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}" FontFamily="Consolas" Background="Transparent" />
</Grid>

А вот и конвертер значений:

class TextToPasswordCharConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return new String('*', value?.ToString().Length ?? 0);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Убедитесь, что ваше свойство Text в вашей модели представления реализует INotifyPropertyChanged

Ответ 9

Этот код определенно поможет вам

<PasswordBox x:Name="Password" InputScope="Password" />

Спасибо !!!