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.

33
demandé sur Dave Clemmer 2009-07-13 17:58:04

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.

27
répondu Brandon 2009-07-13 14:07:11

Il existe un moyen de se lier à un PasswordBox ici: PasswordBox De Liaison De Données

9
répondu gimpy 2009-11-05 21:49:47

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.

9
répondu Cody C 2012-01-26 17:32:23

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
        });
   }
}
4
répondu Kwex 2015-02-25 23:11:51

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).

2
répondu Tasnim Fabiha 2017-02-22 14:48:26

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;
1
répondu Daniel_Uns 2015-07-20 13:26:38
<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

0
répondu David 2018-10-02 11:26:29