3

近くのエラーコンテンツを表示するのではなく、画面の1か所にエラー(IDataErrorInfo.Errors)を表示したいので、フォームの最後にtextBlockを配置しました。バインド用に現在フォーカスされている要素を取得するにはどうすればよいですか(検証.Errors)[0].ErrorContent。

これは、コードビハインドではなくXAMLで実行する必要があります。

フォーカスが変更されると、その要素のエラーコンテンツが画面の下部に配置されたTextBlockに表示されます。

ありがとう&よろしくDineshbabu Sengottian

4

1 に答える 1

3

を使用して、フォーカスされた要素にアクセスできます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たを文字列に変換するコンバーターなどです。

于 2012-05-13T08:52:52.070 に答える