2009-07-13 4 views
31

Comment puis-je faire en XAML:Comment faire un TextBox être une "boîte de mot de passe" et afficher des étoiles lors de l'utilisation de MVVM?

PSEUDO-CODE:

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

afin que l'utilisateur voit étoiles ou des points quand il est en train de taper le mot de passe.

J'ai essayé various examples qui suggèrent PasswordChar et PasswordBox mais ne peut pas obtenir ces à travailler.

par exemple. Je peux le faire comme le montre here:

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

mais je tiens bien évidemment à lier la propriété Text à mon ViewModel je peux envoyer la valeur la zone de texte liée lorsque 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é Text.

+1

Pouvez-vous donner des détails sur les raisons pour lesquelles PasswordChar et PasswordBox n'ont pas fonctionné? –

+0

il semble que ce n'est pas si simple en utilisant MVVM, j'ai trouvé une question similaire ici: http: // stackoverflow.com/questions/1097235/passwordbox-with-mvvm –

Répondre

26

Pour obtenir ou définir le mot de passe dans un PasswordBox, utilisez la propriété Password. Tels que

string password = PasswordBox.Password; 

Cela ne prend pas en charge Databinding autant que je sache, de sorte que vous auriez à définir la valeur dans la codebehind, et le mettre à jour en conséquence.

+0

Pourrait mentionner: user7116

+2

Je ne pense pas que cela fonctionne réellement, du moins pas quand j'ai essayé. – Brandon

+0

si je définis la valeur de ma boîte de mot de passe dans code-behind, alors il n'est plus testable unité, sûrement je peux lier le mot de passe du viewmodel –

8

Envoyez le contrôle PasswordBox en tant que paramètre à votre commande de connexion.

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

Ensuite, vous pouvez appeler CType(parameter, PasswordBox).Password dans votre viewmodel.

+1

Cela viole le modèle MVVM. –

3

Merci Cody, c'était très utile. Je viens d'ajouter un exemple pour les gars en utilisant la commande délégué 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 
     }); 
    } 
} 
1

J'ai fait ci-dessous des vues CodeBehind pour définir ma propriété dans le modèle de vue. Vous ne savez pas si cela «rompt» le modèle MVVM, mais c'est la solution la meilleure et la moins complexe trouvée.

var data = this.DataContext as DBSelectionViewModel; 

     data.PassKey = txtPassKey.Password; 
2

Vous pouvez faire votre TextBox comme customed PasswordBox en ajoutant simplement la valeur suivante FontFamily propriété de votre contrôle TextBox.

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

Dans mon cas cela fonctionne parfaitement. Cela montrera point à la place du texte réel (pas étoile (*) si).

Questions connexes