グリッドの DataTemplate 列の Textbox の検証で問題が発生しています。テキストボックスがバインドされているプロパティは「double」値です。これがTextBoxの私のxamlコードです
<TextBox Text="{Binding SubTotalRawHours, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}"
MinHeight="24" VerticalAlignment="Top" BindingValidationError="ValidateTime" />
そしてここにプロパティがあります
private double _SubTotalRawHours;
public double SubTotalRawHours
{
get { return _SubTotalRawHours; }
set
{
if (value < 0)
{
throw new Exception("Value not allowed");
}
_SubTotalRawHours = value;
NotifyPropertyChanged("SubTotalRawHours");
}
}
奇妙な問題は、アルファベットを入力すると、コードに「入力が正しい形式ではありません」というエラーメッセージを含むツールチップが表示されることです。これは正しいです。しかし、負の値を入力すると、「例外はコードによって処理されませんでした」という例外が発生します。ここで起こっていること
if (value < 0)
{
throw new Exception("Value not allowed");
}
私はすべてを試しましたが、テキストボックスをグリッドの外に配置しようとしましたが、機能しません。
ここでいくつかの入力を本当に感謝します。
編集 1
OK、コードにいくつかの変更を加えたので、回避策があります。代わりに"ValidatesOnExceptions=True"
、"ValidatesOnDataErrors=True"
Model クラスも継承しIDataErrorInfo
、クラスに IDataErrorInfo メンバーを実装しました。
private string _dataError = string.Empty;
const string _ErrorsText = "Errors";
string IDataErrorInfo.Error
{
get { return _dataError; }
}
public string this[string propertyName]
{
get
{
_dataError = null;
switch (propertyName)
{
case "OldHours":
if (OldHours < 0 || OldHours > 100)
{
return "Please enter a value between 0 - 100.";
}
break;
}
return null;
}
}
これは機能しています(ツールチップが間違った場所に表示されることは別として、それは問題ありません)。私のコードが例外をキャッチしなかった理由をまだ理解できません。モデルクラスに追加しなければならないものはありますか?