こんな感じで、wpfバインディングをしています
<TextBox
Name="txtRackNo"
Grid.Column="5"
Grid.ColumnSpan="7"
Grid.Row="4"
Grid.RowSpan="1"
Style="{StaticResource ResourceKey=styleValidationTextBox}"
Text="{Binding Path=rack_no, Mode=TwoWay, ValidatesOnDataErrors=True, UpdateSourceTrigger=LostFocus}">
</TextBox>
IDataErrorInfo を実装し、viewmodel にプロパティを直接持つと、機能し、ツールチップと赤い検証ボックスが表示されます。
ビューモデルのプロパティであるクラスに IDataErrorInfo を実装すると、スタイルによってツールチップが作成されますが、赤いエラー ボックスは表示されません。私のスタイルが機能していると確信しています。この行を変更すると、
Text="{Binding Path=rack_no, Mode=TwoWay, ...}"
私のデータ型「RACK」を使用するには
Text="{Binding Path=rack.rack_no, Mode=TwoWay, ...}"
private Rack _rack;
public Rack rack
{
get { return _rack; }
set
{
_rack = value;
createPropertyObserver();
base.RaisePropertyChanged("rack");
}
}
次に、ツールチップのみが表示され、赤い検証エラー ボックスは表示されません。
編集:これはより多くのコードです。おそらくこれは誰かが私の質問をよりよく理解するのに役立ちますか?
class Rack : ObservableObject, IDataErrorInfo
{
public String _rack_no;
public String rack_no
{
get { return _rack_no; }
set
{
if (value != null)
{
_rack_no = value;
base.RaisePropertyChanged("rack_no");
}
}
}
public String Error
{
get { return this[null]; }
}
public String this[String propertyName]
{
get
{
String result = String.Empty;
propertyName = propertyName ?? String.Empty;
if (propertyName == String.Empty || propertyName == "dc_name")
{
if (String.IsNullOrEmpty(this.dc_name))
{
result += "Datacenter name is mandatory." + Environment.NewLine;
}
}
if (propertyName == String.Empty || propertyName == "rack_no")
{
if (String.IsNullOrEmpty(this.rack_no) || this.rack_no.Length > 5)
{
result += "Rack number is mandatory and must be 5 letters or less."
+ Environment.NewLine;
}
}
Debug.WriteLine(result);
return result.TrimEnd();
}
}
次に、ビューモデルの一部を次に示します。
private Rack _rack;
public Rack rack
{
get { return _rack; }
set
{
_rack = value;
createPropertyObserver();
base.RaisePropertyChanged("rack");
}
}
私の見解では、テキスト ボックスを Rack.rack_no にバインドすると、検証エラーが発生すると、ツールチップが機能し、適切なエラー メッセージが表示されます。ただし、validationstyle を使用するようにテキスト ボックスを変更するわけではありません。
同じプロパティ (rack_no) を作成し、ビューモデルに idataerrorinfo を実装すると、代わりにこれにバインドされ、完全に機能します。
ここで何か間違ったことをしているかどうかを知りたいだけです。たとえば、これは検証の有効なバインディングではありませんか? Rack.rack_no クラスに引き続きバインドして検証を使用できるようにする方法はありますか?