を使用して、フォーカスされた要素にアクセスできますFocusManager.FocusedElement
。これは、コードビハインドなしで純粋にXAMLで機能する例です(もちろん、IDataErrorInfo
テスト用のエラーを提供するために必要なコードビハインドを除く)。
<Window x:Class="ValidationTest.MainWindow"
x:Name="w"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<TextBox x:Name="txt1" Text="{Binding Path=Value1, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, Mode=TwoWay}"/>
<TextBox x:Name="txt2" Text="{Binding Path=Value2, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, Mode=TwoWay}"/>
<TextBlock Foreground="Red" Text="{Binding
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}},
Path=(FocusManager.FocusedElement).(Validation.Errors)[0].ErrorContent}"/>
</StackPanel>
</Window>
テストクラスMainWindow
のコードは次のとおりです。
namespace ValidationTest
{
public partial class MainWindow : Window, IDataErrorInfo
{
public MainWindow()
{
InitializeComponent();
DataContext = this;
Value1 = "a";
Value2 = "b";
}
public string Value1 { get; set; }
public string Value2 { get; set; }
#region IDataErrorInfo Members
public string Error
{
get { return ""; }
}
public string this[string name]
{
get
{
if (name == "Value1" && Value1 == "x")
{
return "Value 1 must not be x";
}
else if (name == "Value2" && Value2 == "y")
{
return "Value 2 must not be y";
}
return "";
}
}
#endregion
}
}
テストでは、最初のテキストボックスに「x」を入力するか、2番目のテキストボックスに「y」を入力すると、検証エラーが発生します。
現在フォーカスされているテキストボックスのエラーメッセージは、TextBlockの2つのテキストボックスの下に表示されます。
このソリューションには1つの欠点があることに注意してください。デバッガーでサンプルを実行すると、次のバインディングエラーが表示されます。
System.Windows.Dataエラー:17:'(Validation.Errors)'(タイプ'ReadOnlyObservableCollection`1')から'Item []'値(タイプ'ValidationError')を取得できません。BindingExpression:Path =(0)。(1)[0] .ErrorContent; DataItem ='MainWindow'(Name ='w'); ターゲット要素は'TextBlock'(Name ='');です。ターゲットプロパティは'Text'(タイプ'String')です。ArgumentOutOfRangeException:'System.ArgumentOutOfRangeException:指定された引数が有効な値の範囲外でした。
これらのデバッグエラーメッセージは、Validation.Errors
配列が空であり、したがって[0]
不正であるため、現在フォーカスされている要素に検証エラーがない場合に発生します。
これらのエラーメッセージを無視するか(サンプルは引き続き正常に実行されます)、それでもコードビハインドが必要です。たとえば、IInputElement
返されFocusManager.FocusedElement
たを文字列に変換するコンバーターなどです。