我基于 TextBox 编写了自定义控件,该控件还具有最小值和最大值输入,如下所示:
public class NumericTextBox : TextBox
{
static NumericTextBox()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(NumericTextBox), new FrameworkPropertyMetadata(typeof(NumericTextBox)));
}
public static readonly DependencyProperty MinimumProperty =
DependencyProperty.Register("Minimum", typeof(int), typeof(NumericTextBox), new PropertyMetadata(default(int)));
public int Minimum
{
get { return (int)GetValue(MinimumProperty); }
set { SetValue(MinimumProperty, value); }
}
public static readonly DependencyProperty MaximumProperty =
DependencyProperty.Register("Maximum", typeof(int), typeof(NumericTextBox), new PropertyMetadata(100));
public int Maximum
{
get { return (int)GetValue(MaximumProperty); }
set { SetValue(MaximumProperty, value); }
}
public new static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(int), typeof(NumericTextBox),
new FrameworkPropertyMetadata(
default(int),
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
null,
CoerceCurrentValue),
IsValid);
public new int Text
{
get { return (int)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
private static object CoerceCurrentValue(DependencyObject d, object baseValue)
{
var numericTextBox = (NumericTextBox)d;
var intValue = (int)baseValue;
if (intValue < numericTextBox.Minimum) intValue = numericTextBox.Minimum;
if (intValue > numericTextBox.Maximum) intValue = numericTextBox.Maximum;
if ((int)baseValue != intValue)
numericTextBox.Text = intValue;
return intValue;
}
private static bool IsValid(object value)
{
if (value == null)
return false;
int intValue;
var result = Int32.TryParse(value.ToString(), out intValue);
return result;
}
}
在我的 xaml 中,我称之为:
<controls:NumericTextBox
Grid.Row="0"
Grid.Column="1"
Margin="5"
VerticalAlignment="Center"
Text="{Binding Test, UpdateSourceTrigger=PropertyChanged}"
Minimum="0"
Maximum="100"
/>
它绑定到我的视图模型中的 Test 属性(作为 int )。一切正常,直到我输入一个字符并出现绑定错误:
System.Windows.Data 错误:7:ConvertBack 无法转换值“1a”(类型“字符串”)。绑定表达式:路径=文本;DataItem='NumericTextBox' (Name=''); 目标元素是'TextBox'(名称='');目标属性是“文本”(类型“字符串”) FormatException:“System.FormatException:输入字符串的格式不正确。在 System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) 在 System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) 在 System.String.System.IConvertible.ToInt32(IFormatProvider提供者)
在 System.Convert.ChangeType(对象值,类型转换类型,IFormatProvider 提供程序)在 MS.Internal.Data.SystemConvertConverter.ConvertBack(对象 o,类型类型,对象参数,CultureInfo 文化)在 System.Windows.Data.BindingExpression.ConvertBackHelper( IValueConverter 转换器,对象值,类型 sourceType,对象参数,CultureInfo 文化)'
可能是因为 TextBox 中的原始 Text 属性是字符串...但我不确定。请协助。