検証プロパティを実行しようとしています。次のような null 許容プロパティがあります。
public int? Number
{
get { return _number; }
set
{
if (_number != value)
{
_number = value;
RaisePropertyChanged("Number");
}
}
}
そして、このプロパティはテキストボックスにバインドされています。この2つのシナリオのみを検証したい:
- ユーザーがテキスト ボックスを空のままにしたとします (textbox.text="")。したがって、 Number プロパティは null 値を受け取る必要があります (代わりに "" )。
- また、ユーザーが「2b」と入力した場合、Number プロパティには null 値が含まれている必要がありますが (エラーであるため)、テキスト ボックスには「2b」と表示されている必要があります。
したがって、これの実装は次のとおりです。
public class IntConverter : IValueConverter
{
private static readonly IntConverter defaultInstance = new IntConverter();
public static IntConverter Default { get { return defaultInstance; } }
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is int?)
{
int? intValue = (int?)value;
if (intValue.HasValue)
{
return intValue.Value.ToString();
}
}
return Binding.DoNothing;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is string)
{
int number;
if (Int32.TryParse((string)value, out number))
{
return number;
}
}
return null;
}
}
上記のコードは実際に機能していますが、うまくいかないことが 1 つあります。ユーザーが「2b」と入力すると、この時点でエラー (赤い境界線) が表示されます。どうすれば修正できますか?
注: Validations プロパティは true です。
<TextBox Text="{Binding Number, UpdateSourceTrigger=PropertyChanged,
ValidatesOnExceptions=True, ValidatesOnDataErrors=True, NotifyOnValidationError=True, TargetNullValue={x:Static sys:String.Empty},
Converter={x:Static c:IntConverter.Default}}" />