2016-04-04 157 views
0

我在使用此接口时遇到了一些问题。在我的课“研究员”,这是一个实现IDataErrorInfo的,我写这样的东西:实现IDataErrorInfo接口

[Serializable] 
public class Researcher : Person, IDeepCopy, IEnumerable, IComparable, IComparer, IDataErrorInfo, INotifyPropertyChanged 
{ 
    public DateTime Date 
    { 
     get 
     { 
      return date; 
     } 
     set 
     { 
      date = value;   
     } 
    } 
    //... 

    public string Error { get { return "Error Text"; } } 

    public string this[string property] 
    { 
     get 
     { 
      string msg = null; 
      if ((this.Date.Year < 1930 && this.Date.Year > 1990) && (this.projjects.Count < 0)) 
       msg = "Not Correct Date"; 

      return msg; 

     } 
    } 
    //... 
} 

在我的XAML代码:

<TextBox Name="birthday" 
        Grid.Row="2" 
        Grid.Column="1" 
        Text="{Binding Date, 
            UpdateSourceTrigger=PropertyChanged, 
            ValidatesOnDataErrors=True}" /> ` 

但这不检查任何东西,我仍然可以在文本框中输入我想要的任何日期。问题是什么?

+2

难道是(this.Date.Year <1930 && this.Date.Year> 1990)总是假?年份不能小于1930年,也不能大于1990年......我认为你可能希望&&(和)是|| (要么)? –

+2

我不确定你实际上想要达到什么目的。但如果问题在于文本框中的文本没有更新,请尝试调用PropertyChanged(this,new PropertyChangedEventArgs(“Date”);否则,UI永远不会知道该变量已更改 –

+0

我同意@ JH看起来像你的意思|||不是&&,但是你应该使用属性参数来选择验证规则并单独验证每个属性 – MikeT

回答

3

我建议将其改为类似这样的

public string Error { get { return string.Empty; } } 
public string this[string property] 
{ 
    get 
    { 
     var msg = new StringBuilder(); 
     switch(property) 
     { 
      case "Date": 
       if(Date <1930) msg.AppendLine("Date must be greater than 1930"); 
       if(Date >1990) msg.AppendLine("Date must be less than 1990"); 
       break; 
      case "projjects": 
       if(projjects.Count <= 0) msg.AppendLine("projjects must contain atleast 1 item"); 
       break; 
     } 

     return msg.ToString(); 
    } 
}` 

的东西,因为这可以让你单独

还需要触发的属性更改事件 因此更改返回有意义的错误和检查每个属性到

public DateTime Date 
{ 
    get { return date; } 
    set 
    { 
     date = value; 
     PropertyChanged(this, new PropertyChangedArg("Date"); 
    } 
} 

同时还需要

+0

它的工作原理,非常感谢 – fghjkl4083

+0

你应该将它标记为答案;) – MikeT