在我的应用程序中,我有一个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中的断点。
如果不正确,我该怎么做只允许数字或拒绝用户输入?
答案 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);