在使用MVVM时,如何将TextBox设置为"密码框"并显示星标?

Edw*_*uay 42 c# wpf xaml textbox mvvm

我怎样才能在XAML中执行此操作:

伪代码:

<TextBox Text="{Binding Password}" Type="Password"/>
Run Code Online (Sandbox Code Playgroud)

这样当用户输入密码时,用户就会看到星星或圆点.

我已经尝试了各种示例,建议使用PasswordCharPasswordBox,但无法使这些工作.

例如,我可以做到这一点,如图在这里:

<PasswordBox Grid.Column="1" Grid.Row="1"
    PasswordChar="*"/>
Run Code Online (Sandbox Code Playgroud)

但我当然希望将Text属性绑定到我的ViewModel,这样我可以在单击按钮时发送绑定TextBox的值(不使用后面的代码),我想这样做:

<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}"/>
Run Code Online (Sandbox Code Playgroud)

但是PasswordBox没有Text属性.

Bra*_*don 33

要在PasswordBox中获取或设置密码,请使用Password属性.如

string password = PasswordBox.Password;
Run Code Online (Sandbox Code Playgroud)

据我所知,这不支持数据绑定,因此您必须在代码隐藏中设置值,并相应地更新它.

  • 我认为这不起作用,至少在我尝试的时候不行. (3认同)
  • 在PasswordBox上不允许数据绑定的原因似乎是这里讨论的一个安全问题:http://social.msdn.microsoft.com/forums/en-US/wpf/thread/7ca97b60-2d8e-4a27-8c5b-b8d5d7370a5e/ (3认同)
  • 我测试了这个解决方案,效果非常好:http://blog.functionalfun.net/2008/06/wpf-passwordbox-and-data-binding.html (3认同)

ssa*_*mko 14

正如 Tasnim Fabiha 提到的,可以更改 TextBox 的字体以仅显示点/星号。但是我找不到他的字体……所以我给你我的工作示例:

<TextBox Text="{Binding Password}" 
     FontFamily="pack://application:,,,/Resources/#password" />
Run Code Online (Sandbox Code Playgroud)

只是复制粘贴是行不通的。首先,您必须下载提到的字体“password.ttf”链接:https : //github.com/davidagraf/passwd/blob/master/public/ttf/password.ttf 然后将其复制到您的项目资源文件夹(Project->Properties ->资源->添加资源->添加现有文件)。然后将它的 Build Action 设置为:Resource。

在此之后,您将只看到点,但您仍然可以从中复制文本,因此需要像这样禁用 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>
Run Code Online (Sandbox Code Playgroud)


Cod*_*y C 10

将passwordbox控件作为参数发送到login命令.

<Button Command="{Binding LoginCommand}" CommandParameter="{Binding ElementName=PasswordBox}"...>
Run Code Online (Sandbox Code Playgroud)

然后你可以调用CType(parameter, PasswordBox).Password你的viewmodel.

  • 这违反了MVVM模式. (3认同)

gim*_*mpy 9

这里有一种绑定PasswordBox的方法:PasswordBox数据绑定


Tas*_*iha 7

您可以通过简单地将以下值添加到您的控件属性来TextBox定制您的自定义。PasswordBoxFontFamilyTextBox

<TextBox
    Text="{Binding Password}"
    FontFamily="ms-appx:///Assets/PassDot.ttf#PassDot"
    FontSize="35"/>
Run Code Online (Sandbox Code Playgroud)

在我的情况下,这非常有效。这将显示点代替实际文本(虽然不是星号(*))。

  • 这家伙是英雄!一个奇怪的人,但仍然是一个英雄! (2认同)

Kwe*_*wex 5

谢谢科迪,这非常有帮助.我刚刚为在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" />
Run Code Online (Sandbox Code Playgroud)

 

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
        });
   }
}
Run Code Online (Sandbox Code Playgroud)