如何将数据输入限制为 1 个字符,但使用值转换器允许用户更改值?

How do I restrict data entry to 1 character, but use the value converter to allow the user to change the value?

我正在使用 .NET 4.5.2 开发 WPF 应用程序。 table 中有几列是位字段(我们正在使用 SQL 服务器)。所以,它们是 C# 中的 bool 数据类型。数据库中的列不可为空。规范要求我将值显示为“Y”或“N”。所以,我想我会将文本框中的数据输入限制为 1。这是 XAML:

<TextBox Style="{StaticResource EnabledTextBox}"
         Text="{Binding ClassRegistration.PeaceOfficer, Converter={StaticResource BoolToYN}, UpdateSourceTrigger=PropertyChanged}" 
         MaxLength="1" />

这是我为处理此问题而编写的 ValueConverter 中的 Convert 方法:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    bool passedBool = (bool)value;

    if (passedBool)
    {
        return "Y";
    }
    else
    {
        return "N";
    }
}

非常简单。但是,在使用它时,该应用程序表现不佳。如果 table 中的值为 1(真),则它在文本框中显示为 Y。我可以删除它,它立即变成N。但是,无论我做什么,我都不能再把它改回Y。

如何限制用户只能使用 1 个字符,但允许他们在 Y 和 N 之间切换?

我认为这里有一些相互关联的问题,但我必须承认我不确定我是否在关注你的问题。

让我先分享一些代码。 Xaml:

        <TextBox Text="{Binding PeaceOfficer, Converter={StaticResource BoolToYn}, UpdateSourceTrigger=LostFocus}"
                 MaxLength="1" />

值转换器:

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool result = false;
        string passedString = (string) value;
        if (passedString == "Y")
        {
            result = true;
        }
        return result;
    }

查看模型:

    public bool PeaceOfficer
    {
        get => _peaceOfficer;
        set
        {
            _peaceOfficer = value;
            OnPropertyChanged();

        }
    }

所以:

  1. 正如一条评论所指出的那样,将触发器设置为 LostFocus.... 这样效果会更好。
  2. 确保正确实施 ConvertBack。根据描述,这可能是您的问题所在。
  3. 确保您实现视图模型以正确执行 属性 更改事件。你可能有,但是,以防万一。

将所有这些放在一个简单的 WPF 应用程序中,我能够让 Y 和 N 正常工作。老实说,除了 Y 之外的任何东西都会 default/reset 到 N.