3

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

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

关于如何实现此功能的任何好主意?

谢谢

/彼得

4

1 回答 1

0

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

您如何看待创建一个派生自 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();
    }
}

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

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

  1. 这种方法需要您在两个地方拥有与验证相关的代码,并且它们需要匹配。(也许您也可以覆盖 OnTextChanged,并在那里设置红色边框。)
  2. 这种方法要求您将规则放在视图层而不是业务对象中,您可能会也可能不会接受。
于 2011-04-03T21:00:27.680 回答