wake-up-neo.com

Wie kann ich eine TextBox zu einer "Passwortbox" machen und Sterne anzeigen, wenn Sie MVVM verwenden?

Wie kann ich das in XAML machen:

PSEUDO-CODE:

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

so dass der Benutzer Sterne oder Punkte sieht, wenn er das Passwort eingibt.

Ich habe verschiedene Beispiele ausprobiert, die PasswordChar und PasswordBox vorschlagen, diese aber nicht zum Laufen bringen.

z.B. Ich kann das wie gezeigt hier :

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

aber ich möchte natürlich die Text-Eigenschaft an mein ViewModel binden, damit ich den Wert der gebundenen TextBox senden kann, wenn die Schaltfläche angeklickt wird (nicht mit hinterlegtem Code).

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

PasswordBox besitzt jedoch keine Texteigenschaft.

38
Edward Tanguay

Um das Passwort in einer PasswordBox abzurufen oder festzulegen, verwenden Sie die Password-Eigenschaft. Sowie

string password = PasswordBox.Password;

Soweit ich weiß, wird dies nicht unterstützt. Daher müsste der Wert im Codebehind festgelegt und entsprechend aktualisiert werden.

30
Brandon

Senden Sie das Kennwortsteuerelement als Parameter an Ihren Anmeldebefehl. 

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

Dann können Sie CType(parameter, PasswordBox).Password in Ihrem Viewmodel aufrufen.

10
Cody C

Es gibt eine Möglichkeit, eine PasswordBox hier zu binden: PasswordBox Databinding

9
gimpy

Danke Cody, das war sehr hilfreich. Ich habe gerade ein Beispiel für Leute hinzugefügt, die den Delegate Command in C # verwenden

<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
        });
   }
}
5
Kwex

Sie können Ihre TextBox als benutzerdefiniert PasswordBox festlegen, indem Sie einfach den folgenden Wert zur FontFamily-Eigenschaft Ihres TextBox-Steuerelements hinzufügen. 

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

In meinem Fall funktioniert das perfekt. Dies wird Punkt anstelle des eigentlichen Textes anzeigen (nicht jedoch Stern (*)).

3
Tasnim Fabiha

Ich habe das unten aus dem Views-Code hinterher gemacht, um meine Eigenschaft innerhalb des View-Modells festzulegen. Nicht sicher, ob das MVVM-Pattern wirklich "kaputt geht", aber es ist die beste und am wenigsten komplexe Lösung, die gefunden wurde.

  var data = this.DataContext as DBSelectionViewModel;

        data.PassKey = txtPassKey.Password;
1
Daniel_Uns

Wie Tasnim Fabiha erwähnt hat, ist es möglich, die Schriftart für TextBox zu ändern, um nur Punkte/Sternchen anzuzeigen. Aber ich konnte seine Schrift nicht finden ... also gebe ich Ihnen mein Arbeitsbeispiel:

<TextBox Text="{Binding Password}" 
     FontFamily="pack://application:,,,/Resources/#password" />

Nur Kopieren und Einfügen funktioniert nicht. Zuerst müssen Sie die erwähnte Schriftart "password.ttf" Link: https://github.com/davidagraf/passwd/blob/master/public/ttf/password.ttf .__ herunterladen. Kopieren Sie diese dann in den Ordner Projektressourcen (Projekt-> Eigenschaften-> Ressourcen-> Ressource hinzufügen-> Vorhandene Datei hinzufügen). Stellen Sie dann Build Action auf: Resource ein.

Danach werden nur noch Punkte angezeigt. Sie können jedoch immer noch Text daraus kopieren. Daher müssen Sie die Tastenkombination STRG + C wie folgt deaktivieren:

<TextBox Text="{Binding Password}" 
     FontFamily="pack://application:,,,/Resources/#password" > 
    <TextBox.InputBindings>
        <!--Disable CTRL+C -->
        <KeyBinding Command="ApplicationCommands.NotACommand"
            Key="C"
            Modifiers="Control" />
    </TextBox.InputBindings>
</TextBox>
1
ssamko

Das Problem bei der Verwendung der PasswordBox ist, dass sie nicht sehr MVVM-freundlich ist, da sie mit SecureString funktioniert und daher ein Shim benötigt, um sie an einen String zu binden. Sie können auch die Zwischenablage nicht verwenden. Während all diese Dinge aus einem bestimmten Grund vorhanden sind, benötigen Sie diese Sicherheitsstufe möglicherweise nicht. Hier ist ein alternativer Ansatz, der mit der Zwischenablage funktioniert, nichts Besonderes. Sie machen den Text und den Hintergrund der TextBox transparent und binden den Text an einen darunter liegenden TextBlock. Dieser Textblock konvertiert Zeichen in * mit dem angegebenen Konverter.

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

Und hier ist der Value Converter:

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();
    }
}

Stellen Sie sicher, dass Ihre Texteigenschaft in Ihrem Viewmodel INotifyPropertyChanged implementiert

0
David