将文本框绑定到小数属性

本文关键字:小数 属性 绑定 文本 | 更新日期: 2023-09-27 17:49:47

在我的应用程序中,我有一个TextBox,用户可以在其中输入1到10之间的数字。这个TextBox的示例如下:

<TextBox Text="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center" x:Name="tbInput"/>

TextBox绑定到的属性值如下:

public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
        "Value", typeof(decimal), typeof(NumericUpDown), new PropertyMetadata((d, e) =>
        {
            ((NumericUpDown)d).Value = (decimal)e.NewValue;
        }));
public decimal Value
{
    get { return (decimal)GetValue(ValueProperty); }
    set
    {
        if (Value == value || value > Maximum || value < Minimum)
            return;
        SetValue(ValueProperty, value);
        OnPropertyChanged("Value");
        OnValueChanged();
    }
}

如果用户输入一个数字,它会工作。但是如果用户输入的是字符或者字符串或者别的什么它就不能工作了。我期望我的TextBox不会接受无效值,但没有达到value - property的setter中的断点。

我必须做些什么来只允许数字或拒绝用户输入,如果它是不正确的?

将文本框绑定到小数属性

语句
((NumericUpDown)d).Value = (decimal)e.NewValue;
PropertyChangedCallback中的

没有意义,因为它只是在另一次将Value属性设置为相同的值。

您应该将代码从属性setter移到回调中。此外,除了在依赖属性的CLR包装器的setter中调用SetValue之外,不应该调用其他任何东西。MSDN上的XAML加载和依赖属性文章解释了原因。

public static readonly DependencyProperty ValueProperty =
    DependencyProperty.Register(
        "Value", typeof(decimal), typeof(NumericUpDown),
        new PropertyMetadata(
            (d, e) =>
            {
                ((NumericUpDown)d).OnValueChanged();
            }));
public decimal Value
{
    get { return (decimal)GetValue(ValueProperty); }
    set { SetValue(ValueProperty, value);}
}

为了验证传递给依赖属性的值,你可以使用DependencyProperty。接受ValidateValueCallback参数的寄存器重载:

public static readonly DependencyProperty ValueProperty =
    DependencyProperty.Register(
        "Value", typeof(decimal), typeof(MainWindow),
        new PropertyMetadata((d, e) => ((NumericUpDown)d).OnValueChanged()),
        v => (decimal)v >= Minimum && (decimal)v <= Maximum);