Проблема с использованием PasswordBox заключается в том, что он не очень дружественен к MVVM из-за того, что он работает с SecureString и, следовательно, для его привязки к строке требуется прокладка. Вы также не можете использовать буфер обмена. Несмотря на то, что все эти причины существуют, вам может не потребоваться такой уровень безопасности. Вот альтернативный подход, который работает с буфером обмена, ничего особенного. Вы делаете текст 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