如何将数据输入限制为 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();
}
}
所以:
- 正如一条评论所指出的那样,将触发器设置为 LostFocus.... 这样效果会更好。
- 确保正确实施 ConvertBack。根据描述,这可能是您的问题所在。
- 确保您实现视图模型以正确执行 属性 更改事件。你可能有,但是,以防万一。
将所有这些放在一个简单的 WPF 应用程序中,我能够让 Y 和 N 正常工作。老实说,除了 Y 之外的任何东西都会 default/reset 到 N.
我正在使用 .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();
}
}
所以:
- 正如一条评论所指出的那样,将触发器设置为 LostFocus.... 这样效果会更好。
- 确保正确实施 ConvertBack。根据描述,这可能是您的问题所在。
- 确保您实现视图模型以正确执行 属性 更改事件。你可能有,但是,以防万一。
将所有这些放在一个简单的 WPF 应用程序中,我能够让 Y 和 N 正常工作。老实说,除了 Y 之外的任何东西都会 default/reset 到 N.