Как я могу сделать 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.
Ответы
Ответ 1
Чтобы получить или установить пароль в PasswordBox, используйте свойство Password. Например,
string password = PasswordBox.Password;
Это не поддерживает привязку данных, насколько я знаю, поэтому вам нужно будет установить значение в коде и обновить ее соответствующим образом.
Ответ 2
Отправьте элемент управления паролем в качестве параметра в свою команду входа.
<Button Command="{Binding LoginCommand}" CommandParameter="{Binding ElementName=PasswordBox}"...>
Затем вы можете вызвать CType(parameter, PasswordBox).Password
в своей модели просмотра.
Ответ 3
Здесь есть способ привязки к PasswordBox: привязка паролей к паролю
Ответ 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" />
Спасибо !!!