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

时间:2009-07-13 13:58:05

标签: c# wpf xaml mvvm textbox

如何在XAML中执行此操作:

伪码:

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

以便用户在输入密码时看到星号或点。

我已尝试various examples建议使用 PasswordChar PasswordBox ,但无法使用这些功能。

e.g。我可以按here所示的方式执行此操作:

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

但我当然希望将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}"/>

但是PasswordBox没有Text属性。

9 个答案:

答案 0 :(得分:32)

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

string password = PasswordBox.Password;

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

答案 1 :(得分:10)

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

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

然后,您可以在视图模型中调用CType(parameter, PasswordBox).Password

答案 2 :(得分:9)

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

答案 3 :(得分:5)

谢谢Cody,这非常有帮助。我刚刚为在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
        });
   }
}

答案 4 :(得分:3)

您只需将以下值添加到TextBox控件的PasswordBox属性即可将FontFamily设为自定义TextBox

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

在我的情况下,这完美无缺。这将显示点代替实际文本(不是星号(*))。

答案 5 :(得分:2)

正如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现有文件)。然后将其“构建操作”设置为:资源。

在此之后,您将仅看到点,但是您仍然可以从中复制文本,因此需要禁用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>

答案 6 :(得分:1)

我在Views codebehind中执行了以下操作,以在视图模型中设置我的属性。不确定它是否真的&#34;符&#34; MVVM模式,但它找到了最好和最不复杂的解决方案。

  var data = this.DataContext as DBSelectionViewModel;

        data.PassKey = txtPassKey.Password;

答案 7 :(得分:0)

使用PasswordBox的问题是,由于它与SecureString配合使用,因此它不是非常友好的MVVM,因此需要使用垫片将其绑定到String。您也不能使用剪贴板。尽管所有这些东西都是有原因的,但您可能不需要这种安全级别。这是适用于剪贴板的另一种方法,没什么花哨的。使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

答案 8 :(得分:0)

此代码肯定会帮助您

<PasswordBox x:Name="Password" InputScope="Password" />

谢谢!