将IDataErrorInfo验证错误应用于usercontrol子元素内的控件错误

时间:2015-07-22 15:24:38

标签: .net wpf wpf-controls

我有一个只包含标签和TextBox的usercontrol。我想使用IDataErrorInfo接口验证我的viewmodel中的文本框条目。验证启动,但错误不会显示在我的usercontrol中的TextBox上,而是显示在usercontrol本身上。

这是usercontrol(其他依赖属性在基类中):

<cc:LabelableInputControl>

<Grid x:Name="LayoutRoot" >
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Label Content="{Binding Path=LabelText, FallbackValue=Empty Label}" 
        Grid.Column="0"
        HorizontalAlignment="Left" 
        Name="BaseLabel" 
        VerticalAlignment="Center" 
        Width="{Binding Path=LabelWidth}"/>

    <TextBox Grid.Column="1" 
        x:Name="BaseTextBox"
        Text="{Binding Text" />
</Grid>
</cc:LabelableInputControl>

这是背后的代码:

public partial class LabelableTextBox : LabelableInputControl
{       
    [Bindable(true)]
    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set
        {
            SetValue(TextProperty, value);
        }
    }
    public static readonly DependencyProperty TextProperty = TextBox.TextProperty.AddOwner(typeof(LabelableTextBox));

    public LabelableTextBox()
    {
        InitializeComponent();

        LayoutRoot.DataContext = this;
    }
}

这就是(假设)使用的方式:

<cc:LabelableTextBox LabelText="{x:Static text:Resources.Label_Username}"
        Text="{Binding Username, Mode=TwoWay,
        ValidatesOnDataErrors=True, NotifyOnValidationError=True}" />

我的问题是:如何将验证错误“转发”到TextBox?目前,验证错误显示如下,但我不希望整个用户控件被框起来。

Only the TextBox should be marked

谢谢!

2 个答案:

答案 0 :(得分:1)

看一下这个主题:Validation Error Templates For UserControl

他们使用ErrorTemplates和触发器来解决它。

答案 1 :(得分:0)

感谢dotvens链接线程,我能够解决我的问题,但有点不同。

  1. 我为usercontrol设置了一个全局样式,以禁用默认的Validation.ErrorTemplate

    <Style TargetType="{x:Type cc:LabelableTextBox}">
        <Setter Property="Validation.ErrorTemplate" Value="{x:Null}" />
    </Style>
    
  2. 我在我的usercontrols代码隐藏中实现了IDataErrorInfo接口:

    public partial class LabelableTextBox : LabelableInputControl, IDataErrorInfo
    {       
        [Bindable(true)]
        public string Text
        {
            get { return (string)GetValue(TextProperty); }
            set
            {
                 SetValue(TextProperty, value);
            }
        }
        public static readonly DependencyProperty TextProperty = TextBox.TextProperty.AddOwner(typeof(LabelableTextBox));
    
        public LabelableTextBox()
        {
            InitializeComponent();
            LayoutRoot.DataContext = this;
        }
    }
    public string Error
    {
        get { throw new System.NotImplementedException(); }
    }
    
    public string this[string columnName]
    {
        get
        {
            string result = null;
    
            var errors = Validation.GetErrors(this);
    
            if (errors.Count > 0)
            {
                result = errors[0].ErrorContent.ToString();
            }
    
            return result;
        }
    }
    
  3. 最后,在我的用户控件内的ValidatesOnDataErrors上设置TextBoxtrue

  4. 多数民众赞成!简单,它的工作。如果有人看到一些缺点,请告诉我。