提问人:Kev12853 提问时间:3/28/2023 更新时间:3/28/2023 访问量:183
绑定到 Decimal 属性时,如何停止空 WPF 文本框上的红色边框?
How do I stop the red border on an empty WPF textbox when bound to a Decimal property?
问:
我有一个绑定到可为 null 的十进制属性的文本框。
<TextBox Text="{Binding DueRent}" Style="{x:Null}" Width="150"/>
public decimal? DueRent { get => _dueRent; set => _dueRent = value; }
当我的 TextBox 首次显示时,它包含 Null,并且没有显示错误模板。如果我使它无效,比如输入“aa”或“space”,那么我会得到红色边框,太好了。如果我输入一个有效的数字,比如 23.7,边界就会消失,这又太好了。但是,如果我只是删除无效文本或有效数字,我会得到红色边框,这不是很好。我希望“空”文本框不显示红色边框。该值不是必需的值,但显然,如果输入该值,则它需要有效。验证比只是一个有效的小数点要复杂一些,但在其他地方会处理。
当输入无效条目时,似乎不会调用 getter 或 setter,它只是出错。
如果我使用 Validation.Template
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel>
<TextBlock DockPanel.Dock="Left" FontWeight="Bold" Foreground="Red">*</TextBlock>
<TextBlock DockPanel.Dock="Bottom" Foreground="Purple" Text="{Binding ErrorContent}" />
<Border BorderBrush="Red" BorderThickness="2">
<AdornedElementPlaceholder />
</Border>
</DockPanel>
</ControlTemplate>with the
</Setter.Value>
</Setter>
然后显示的消息是“值 aa 无法转换”,这与“aa”不能转换为小数一样有意义,但是,如果我随后将另一个无效值放入框中并按 Tab 键离开,则错误消息不会更改,这表明它没有使用新的无效数据重新验证自己?!?
我尝试过 FallBackValue = 0 和 = x:Null。
我尝试了此处找到的 Binding.ValidationRules 如何让 TextBox 只接受 WPF 中的数字输入?
当值为“aa”时,它返回 IsValid=False 并返回正确的错误消息,当值为 '' 时返回 IsValid=True,但文本框保持无效,并显示新消息“Value '' cannot be converted”,它不是从 Binding.ValidationRules 获取的
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
var validationResult = new ValidationResult(true, null);
if (value != null )
{
if (!string.IsNullOrEmpty(value.ToString()))
{
var regex = new Regex("[^0-9.-]+"); //regex that matches disallowed text
var parsingOk = !regex.IsMatch(value.ToString());
if (!parsingOk)
{
validationResult = new ValidationResult(false, "Illegal Characters, Please Enter Numeric Value");
}
}
}
return validationResult;
}
当 TextBox 为空时,如何阻止 TextBox 进入错误状态?
谢谢。
答:
您不能绑定到非类型并期望其表现得特殊。它不是数字输入控件。由于属性的名称及其类型指示它是输入控件。
与非属性类型的绑定之所以有效,是因为 XAML 引擎使用类型转换器并尝试将值从正确的类型转换为正确的类型(在本例中)。由于存在 to 转换的默认转换器,因此如果字符串为数字,则不会出现转换错误。
但 still 的行为类似于文本输入字段。虽然空字符串是有效值,但默认情况下,它不能转换为数值。TextBox.Text
string
TextBox
Text
string
string
string
decimal
string
decimal
TextBox
string
您必须提供正确的转换,例如将空转换为 。或者,截获键盘输入以将空格替换为 。这需要一些额外的逻辑,例如抑制多个空格字符。string
0
0
为抑制空字符串输入的单个用例附加转换器似乎更方便:
public class WhitespceToNumericValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
=> value;
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
=> value is string input && string.IsNullOrWhiteSpace(input)
? 0
: value;
}
<Window.Resources>
<WhitespceToNumericValueConverter x:Key="WhitespceToNumericValueConverter" />
</Window.Resources>
<TextBox Text="{Binding DueRent, Converter={StaticResoucre WhitespceToNumericValueConverter}}" />
评论
string
decimal.TryParse
decimal
true
string
int
double
TryParse
string
NumericTextBox
NumericTextBox
评论