Comment faire pour qu'une boîte de texte soit une "boîte de mots de passe" et affiche des étoiles en utilisant MVVM?
Comment puis-je faire cela dans le code XAML:
PSEUDO-CODE:
<TextBox Text="{Binding Password}" Type="Password"/>
de sorte que l'utilisateur voit des étoiles ou des points quand il tape le mot de passe.
j'ai essayé divers exemples ce qui suggère PasswordChar et PasswordBox mais je n'arrive pas à les faire marcher.
par exemple, je peux faire ce que montre ici:
<PasswordBox Grid.Column="1" Grid.Row="1"
PasswordChar="*"/>
mais je veux bien sûr lier la propriété Text à my ViewModel donc je peux envoyer la valeur la boîte de texte liée quand le bouton est cliqué( ne fonctionne pas avec le code derrière), je veux faire ceci:
<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}"/>
mais PasswordBox n'a pas de propriété textuelle.
7 réponses
pour obtenir ou définir le mot de passe dans un PasswordBox, utilisez la propriété Password.
string password = PasswordBox.Password;
cela ne supporte pas la Databinding autant que je sache, donc vous devez définir la valeur dans le codebehind, et le mettre à jour en conséquence.
Il existe un moyen de se lier à un PasswordBox ici: PasswordBox De Liaison De Données
envoyer la commande passwordbox comme paramètre à votre commande login.
<Button Command="{Binding LoginCommand}" CommandParameter="{Binding ElementName=PasswordBox}"...>
Ensuite, vous pouvez appeler CType(parameter, PasswordBox).Password
dans le viewmodel.
Merci Cody, c'était très utile. J'ai juste ajouté un exemple pour les gars qui utilisent la commande Delegate en C#
<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
});
}
}
Vous pouvez faire votre TextBox
comme personalisés PasswordBox
simplement en ajoutant la valeur suivante FontFamily
propriété de votre TextBox
de contrôle.
<TextBox
Text="{Binding Password}"
FontFamily="ms-appx:///Assets/PassDot.ttf#PassDot"
FontSize="35"/>
Dans mon cas, cela fonctionne parfaitement. Ceci montrera le point à la place du texte réel (pas l'étoile(*) cependant).
j'ai fait ce qui suit à partir des vues codebehind pour définir ma propriété dans le modèle de vue. Pas sûr si elle vraiment "casse" le modèle MVVM, mais c'est la meilleure et la moins complexe solution trouvée.
var data = this.DataContext as DBSelectionViewModel;
data.PassKey = txtPassKey.Password;
<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>
Et voici le Convertisseur de valeurs:
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();
}
}
assurez-vous que votre propriété textuelle sur votre viewmodel implémente INotifyPropertyChanged