2009-07-13 6 views
31

¿Cómo puedo hacer esto en XAML:¿Cómo puedo hacer que un TextBox sea un "cuadro de contraseña" y mostrar estrellas cuando uso MVVM?

pseudo-código:

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

para que el usuario ve estrellas o puntos cuando se está escribiendo en la contraseña.

He intentado various examples que sugieren PasswordChar y PasswordBox pero no puede conseguir éstos para trabajar.

p. Ej. Puedo hacer esto como se muestra here:

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

pero, por supuesto, quieren obligar a la propiedad de texto a mi modelo de vista para que pueda enviar el valor del cuadro de texto enlazado cuando se hace clic en el botón (no se trabaja con código detrás), Quiero hacer esto:

<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}"/> 

Pero PasswordBox no tiene una propiedad de texto.

+1

¿Puede dar detalles de por qué PasswordChar y PasswordBox no funcionaron? –

+0

Parece que esto no es tan directo usando MVVM, encontré una pregunta similar aquí: http: // stackoverflow.com/questions/1097235/passwordbox-with-mvvm –

Respuesta

26

Para obtener o establecer la Contraseña en un PasswordBox, use la propiedad Contraseña. Tal como

string password = PasswordBox.Password; 

Esto no apoyar la vinculación de datos por lo que yo sé, por lo que tendría que establecer el valor en el código subyacente, y actualizar en consecuencia.

+0

Podría mencionar: user7116

+2

No creo que realmente funcione, al menos no cuando lo intenté. – Brandon

+0

si defino el valor de mi cuadro de contraseña en el código subyacente, entonces ya no es comprobable por unidad, seguramente puedo vincular la contraseña del modelo de vista de alguna manera –

8

Enviar el control PasswordBox como parámetro al comando de inicio de sesión.

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

A continuación, puede llamar CType(parameter, PasswordBox).Password en su modelo de vista.

+1

Esto viola el patrón MVVM. –

3

Gracias Cody, eso fue muy útil. Acabo de añadir un ejemplo para los chicos utilizando el comando Delegado 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

hice el siguiente código subyacente de las Vistas para establecer mi propiedad dentro del modelo de vista. No estoy seguro de si realmente "rompe" el patrón de MVVM, pero es la mejor y menos compleja solución encontrada.

var data = this.DataContext as DBSelectionViewModel; 

     data.PassKey = txtPassKey.Password; 
2

Usted puede hacer su TextBox como customed PasswordBox simplemente agregando el siguiente valor a FontFamily propiedad de su control TextBox.

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

En mi caso, esto funciona a la perfección. Esto mostrará un punto en lugar del texto real (no estrella (*)).

Cuestiones relacionadas