在WPF throgh XAML中获得重点元素

时间:2012-05-12 23:46:59

标签: wpf idataerrorinfo

我想在屏幕的一个位置显示错误(IDataErrorInfo.Errors),而不是显示附近的错误内容..所以为此我将textBlock放在窗体的末尾..我怎样才能获得当前的聚焦元素绑定(Validation.Errors)[0] .ErrorContent。

这应该在XAML中完成,而不是在Code背后。

当焦点改变时,那个元素的错误内容显示在放置在屏幕底部的TextBlock中..

谢谢&问候 Dineshbabu Sengottian

1 个答案:

答案 0 :(得分: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”或在第二个文本框中输入“y”,则会出现验证错误。

当前聚焦文本框的错误消息显示在TextBlock中的两个文本框下方。

请注意,此解决方案有一个缺点。如果在调试器下运行示例,您将看到这些绑定错误:

  

System.Windows.Data错误:17:无法从'(Validation.Errors)'获取'Item []'值(类型'ValidationError')(类型'ReadOnlyObservableCollection`1')。 BindingExpression:路径=(0)(1)[0] .ErrorContent; DataItem ='MainWindow'(Name ='w'); target元素是'TextBlock'(Name =''); target属性为'Text'(类型'String')ArgumentOutOfRangeException:'System.ArgumentOutOfRangeException:指定的参数超出有效值范围。

当前焦点元素没有验证错误时会发生这些调试错误消息,因为Validation.Errors数组为空,因此[0]是非法的。

您可以选择忽略这些错误消息(示例仍然正常运行),或者您需要一些代码隐藏,例如转换器,将IInputElementFocusManager.FocusedElement返回的字符串转换为字符串。