0

我在 xaml 中有一个文本框,这里是 .cs 文件中的代码:

public static readonly DependencyProperty dp =
            DependencyProperty.Register(
                "result", typeof( uint ), typeof( ui ),
                new FrameworkPropertyMetadata( ( uint )100, new PropertyChangedCallback( ResultChanged ) ) );


private static void ResultChanged(
            DependencyObject d, DependencyPropertyChangedEventArgs e )
        {
            var input = ( ui )d;
            var value = ( uint )e.NewValue;
        }

上面的代码效果很好,它不允许在文本框中输入任何字母或无效字符。但是我怎样才能改变上面的代码,使用户不能在文本框中输入“0”呢?所以基本上允许除 0 之外的所有 uint。

4

1 回答 1

0

有很多方法可以做到这一点....最简单和最简单的就是使用扩展 WPF 工具包中的 NumericUpDown 控件....设置最小/最大范围并进行排序。

http://wpftoolkit.codeplex.com/wikipage?title=NumericUpDown


如果您确实想自己做逻辑,那么......

您可以根据您的需要/要求在依赖属性的寄存器中指定“强制回调”和/或“验证回调”,即您是否需要将值固定在一个范围内,或者向用户显示错误指示器?

“强制”是您将值调整为其他值的地方,例如在这种情况下,您可能决定将任何值 0 调整为 1(或可能为 null)。

“验证”是检查值的地方,你说它是否正确(通过返回真或假)......如果你返回假......那么就会引发异常。

您在与 DependencyProperty 的绑定上使用 ValidatesOnException,以便以显示 ErrorTemplate 的方式将该“错误”传播到用户界面(默认显示控件周围的红色边框)。

在这种情况下,我将展示仅使用强制回调...因为我假设您不希望在 TextBox 内等待无效值。如果您想要验证...然后查看上面的链接。(您不需要 Changed 回调,因此将其设置为 null)。

public static readonly DependencyProperty dp =
    DependencyProperty.Register(
        "result", typeof( uint ), typeof( ui ),
        new FrameworkPropertyMetadata(
            ( uint )100, 
            null,
            new CoerceValueCallback( ResultCoerceValue )
        )
    );


private static object ResultCoerceValue 
    (DependencyObject depObj, object baseValue)
{
    uint coercedValue = (uint)baseValue;

    if ((uint)baseValue == 0)
        coercedValue = 1; // might be able to set to null...but not sure on that.

    return coercedValue;
}

您还可以使用不同的技术,例如 ValidationRules、可能是 MaskedTextBox,以及使用 PreviewTextInput。

于 2012-08-07T20:20:21.733 回答