Я пытаюсь создать свой собственный очень простой NumberBox, унаследованный от TextBox, который проверяет ввод на потерянном фокусе и форматирует значение на основе указанных десятичных разрядов. Все работает хорошо, пока кто-то не выставит какое-то неверное значение.
В случае недопустимого значения, я бы хотел, чтобы NumberBox оставалось пустым, а не 0.0. Сброс его к действительному значению, например, 0.0, пропустит обязательную проверку поля, которую я имею в своем коде.
Я попытался this.Text = "", но это вызывает исключение привязки "Входная строка не в правильном формате"
Если я попробую this.ClearValue (TextProperty), он очищает текстовое поле, но удаляет также привязку. Есть идеи, как достичь этого или лучшего NumberBox, кроме инструментария?
public delegate void ValueChangedHandler(object sender, EventArgs args);
public class NumberBox : TextBox
{
public event ValueChangedHandler ValueChanged;
public NumberBox()
{
this.DefaultStyleKey = typeof(TextBox);
this.LostFocus += new RoutedEventHandler(NumberBox_LostFocus);
}
public static readonly DependencyProperty DecimalPlacesProperty = DependencyProperty.Register(
"DecimalPlaces",
typeof(int),
typeof(NumberBox),
new PropertyMetadata(2));
public static readonly DependencyProperty MaxValueProperty = DependencyProperty.Register(
"MaxValue",
typeof(double),
typeof(NumberBox),
new PropertyMetadata(Double.MaxValue));
public static readonly DependencyProperty MinValueProperty = DependencyProperty.Register(
"MinValue",
typeof(double),
typeof(NumberBox),
new PropertyMetadata(0.0));
public int DecimalPlaces
{
get
{
return (int)this.GetValue(DecimalPlacesProperty);
}
set
{
base.SetValue(DecimalPlacesProperty, value);
}
}
public Double MaxValue
{
get
{
return (Double)this.GetValue(MaxValueProperty);
}
set
{
base.SetValue(MaxValueProperty, value);
}
}
public Double MinValue
{
get
{
return (Double)this.GetValue(MinValueProperty);
}
set
{
base.SetValue(MinValueProperty, value);
}
}
void NumberBox_LostFocus(object sender, RoutedEventArgs e)
{
double result;
//if (this.Text.Trim().Length == 0)
// return;
if (double.TryParse(this.Text, out result))
{
result = Math.Min(result, this.MaxValue);
result = Math.Max(result, this.MinValue);
this.Text = Math.Round(result, this.DecimalPlaces).ToString("N" + this.DecimalPlaces);
}
else
{
try
{
//this.Text = Math.Min(this.MinValue, 0.0).ToString();
this.ClearValue(TextBox.TextProperty);
}
catch
{
}
}
if (ValueChanged != null)
ValueChanged(this, EventArgs.Empty);
}
}