2016-04-04 207 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