使用IValueConverter屏蔽文本框输入而不会丢失数据

时间:2013-02-05 00:12:23

标签: c# wpf mvvm

我正在尝试创建一个文本框/ IValueConverter,如果用户点击1234然后退格3次,将向用户显示以下行。

1
*2
**3
***4
***
**
*

目前我最大的问题是我丢失了数据,因为IValueConverter在我的ViewModel中保存了“*** 4”。

有没有使用常规PasswordBox屏蔽输入数据的常用策略?

1 个答案:

答案 0 :(得分:0)

您可以创建一个虚拟TextBlockLabel来显示遮罩,并将TextBox文字coloe设置为透明。这样,实际数据将保存到模型中,*仅显示在标签中。

像(非常粗略的例子)

<Window x:Class="WpfApplication13.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication13"
        Title="MainWindow" Height="350" Width="525" Name="UI">
    <Window.Resources>
        <local:TextToStarConverter x:Key="TextToStarConverter" />
    </Window.Resources>
    <StackPanel>
        <Grid>
            <TextBox x:Name="txtbox" Foreground="Transparent" Text="{Binding MyModelProperty}" />
            <Label Content="{Binding ElementName=txtbox, Path=Text, Converter={StaticResource TextToStarConverter}}"  IsHitTestVisible="False" />
        </Grid>
    </StackPanel>
</Window>

转换器(请忽略可怕的代码,它只是一个演示:))

public class TextToStarConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is string && !string.IsNullOrEmpty(value.ToString()))
        {
            return new string('*', value.ToString().Length -1) + value.ToString().Last().ToString();
        }
        return string.Empty;
    }

   public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }
}

结果:

enter image description here