web-dev-qa-db-ja.com

TextBoxを「パスワードボックス」にして、MVVMを使用しているときに星を表示するにはどうすればよいですか?

XAMLでこれを行うには:

擬似コード:

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

ユーザーがパスワードを入力するときに星または点が表示されるようにします。

さまざまな例 試してみましたPasswordCharおよびPasswordBoxしかし、これらを機能させることはできません。

例えば here のようにこれを行うことができます:

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

しかし、ボタンがクリックされたときにバインドされたTextBoxに値を送信できるように、TextプロパティをViewModelにバインドしたいのですが(コードビハインドでは機能しません)、次のようにします。

<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にはTextプロパティがありません。

41
Edward Tanguay

PasswordBoxでパスワードを取得または設定するには、Passwordプロパティを使用します。といった

string password = PasswordBox.Password;

私が知っている限り、これはデータバインディングをサポートしていないため、コードビハインドに値を設定し、それに応じて更新する必要があります。

33
Brandon

Passwordboxコントロールをパラメーターとしてログインコマンドに送信します。

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

その後、ビューモデルでCType(parameter, PasswordBox).Passwordを呼び出すことができます。

11
Cody C

ここにPasswordBoxをバインドする方法があります: PasswordBox Databinding

9
gimpy

ありがとう、コーディ、とても助かりました。 C#でDelegate Commandを使用している男性向けの例を追加しました。

<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

Tasnim Fabihaが述べたように、ドット/アスタリスクのみを表示するためにTextBoxのフォントを変更することが可能です。しかし、私は彼のフォントを見つけることができませんでした...私はあなたに私の実例を与えます:

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

コピー&ペーストだけでは機能しません。まず、前述のフォント「password.ttf」リンクをダウンロードする必要があります: https://github.com/davidagraf/passwd/blob/master/public/ttf/password.ttf 次に、それをプロジェクトのResourcesフォルダーにコピーします(Project-> Properties-> Resources-> Add resource-> Add existing file)。次に、ビルドアクションをリソースに設定します。

この後、ドットのみが表示されますが、そこからテキストをコピーすることができます。そのため、次のようにCTRL + Cショートカットを無効にする必要があります。

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

TextBoxコントロールのPasswordBoxプロパティに次の値を追加するだけで、FontFamilyをカスタムTextBoxとして作成できます。

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

私の場合、これは完全に機能します。これにより、実際のテキストの代わりにドットが表示されます(ただし、スター(*)ではありません)。

3
Tasnim Fabiha

ビューモデル内でプロパティを設定するために、ビューのコードビハインドから以下を行いました。 MVVMパターンを本当に「破壊」するかどうかはわかりませんが、その最良かつ最も複雑でないソリューションが見つかりました。

  var data = this.DataContext as DBSelectionViewModel;

        data.PassKey = txtPassKey.Password;
1
Daniel_Uns

PasswordBoxを使用する場合の問題は、SecureStringで動作するため、MVVMにあまり馴染みがないため、それを文字列にバインドするためにシムが必要なことです。クリップボードも使用できません。これらはすべて理由がありますが、そのレベルのセキュリティは必要ないかもしれません。クリップボードで機能する別のアプローチを次に示します。 TextBoxのテキストと背景を透明にし、その下のTextBlockにテキストをバインドします。このテキストブロックは、指定されたコンバーターを使用して文字を*に変換します。

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

そして、ここに値コンバーターがあります:

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

ビューモデルのTextプロパティがINotifyPropertyChangedを実装していることを確認してください

0
David