wpf - 结合文本框的 ValidationRule 和值转换器

标签 wpf validation binding valueconverter

我有一个简单的问题,但我找不到好的解决方案。 我有一个绑定(bind)到双属性值的文本框。用户可以在文本框中输入值,但我只想允许 0 到 100 之间的值。如果在文本框仍具有焦点时输入无效值,我想在文本框周围显示一个红色框(UpdateSourceTrigger =“PropertyChanged” ).如果用户点击远离文本框,我想使用 UpdateSourceTrigger="LostFocus"上的值转换器来限制值。

执行验证规则或转换器很容易,但我不能将它们组合起来,因为我希望验证在 UpdateSourceTrigger="PropertyChanged"上触发,而转换器应在 UpdateSourceTrigger="LostFocus"上触发。不幸的是,在我的 TextBox.Text 上设置绑定(bind)时,我只能选择其中之一。

关于如何实现此功能有什么好的想法吗?

谢谢

/彼得

最佳答案

这是一个有趣的问题。我不确定我是否有完整的解决方案,但我想提出一些想法。

您如何看待创建一个派生自 TextBox 的新类?它可以有两个依赖属性,MinValue 和 MaxValue。然后它可以覆盖 OnLostFocus。 (免责声明:我没有测试过以下代码。)

public class NumericTextBox : TextBox
{
    public static readonly DependencyProperty MinValueProperty =
        DependencyProperty.Register("MinValue", typeof(double), typeof(NumericTextBox), new UIPropertyMetadata(Double.MinValue));

    public static readonly DependencyProperty MaxValueProperty =
        DependencyProperty.Register("MaxValue", typeof(double), typeof(NumericTextBox), new UIPropertyMetadata(Double.MaxValue));

    public double MinValue
    {
        get { return (double)GetValue(MinValueProperty); }
        set { SetValue(MinValueProperty, value); }
    }

    public double MaxValue
    {
        get { return (double)GetValue(MaxValueProperty); }
        set { SetValue(MaxValueProperty, value); }
    }

    protected override void OnLostFocus(System.Windows.RoutedEventArgs e)
    {
        base.OnLostFocus(e);

        double value = 0;

        // Parse text.
        if (Double.TryParse(this.Text, out value))
        {
            // Make sure the value is within the acceptable range.
            value = Math.Max(value, this.MinValue);
            value = Math.Min(value, this.MaxValue);
        }

        // Set the text.
        this.Text = value.ToString();
    }
}

这将消除对转换器的需要,并且您的绑定(bind)可以使用 UpdateSourceTrigger=PropertyChanged 来支持您的验证规则。

诚然,我的建议有其缺点。

  1. 这种方法要求您在两个地方使用与验证相关的代码,并且它们需要匹配。 (也许您也可以重写 OnTextChanged,并在那里设置红色边框。)
  2. 这种方法要求您将规则放在 View 层而不是业务对象中,您可能会觉得可以接受也可能不会接受。

关于wpf - 结合文本框的 ValidationRule 和值转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5060557/

相关文章:

java - 使用 Java Server Faces 将多个输入字段绑定(bind)到支持 bean 属性?

python - 优化:Python、Perl 和 C 后缀树库

c# - Wpf 实时数据绑定(bind)到 ListView

c# - 动态加载项源的 WPF DataGrid 垂直滚动条问题

c# - Linq AddRange() 用于从接口(interface)派生的对象

wpf - WPF RichTextBox用行号创建编辑器

c# - 使用 RenderedGeometry 作为路径数据不起作用

java - 当 beanType 是接口(interface)时 Validator.validateValue 忽略验证(hibernate-validator-6.0.18)

基于提示值的 Javascript 警报

validation - 如何更改所需 HTML 表单字段的 WebKit 错误消息