将TextBox绑定到decimal-property

时间:2015-05-20 06:47:20

标签: c# wpf binding

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

<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中的断点。

如果不正确,我该怎么做只允许数字或拒绝用户输入?

1 个答案:

答案 0 :(得分:1)

声明

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

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

您应该将代码从属性设置器移动到回调。此外,除了SetValue之外,您不应该在依赖项属性的CLR包装器的setter中调用任何内容。原因在MSDN上的XAML Loading and Dependency Properties文章中进行了解释。

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);}
}

为了验证传递给依赖项属性的值,您可以使用带有ValidateValueCallback参数的DependencyProperty.Register重载:

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);