2016-07-11 5 views
2

У меня есть idataerrorinfo, как показано ниже, но он не работает. Можете ли вы мне помочь? Это не ошибка на экране при отладке.idataerrorinfo в C# WPF

Модель часть:

class Person : Viewmodelbase, INotifyPropertyChanged{ 
    private string name; 
    private string age; 
    public string Name{ 
     get 
     { 
      return name; 
     } 

     set 
     { 
      name = value; 
      if (string.IsNullOrWhiteSpace(value)) 
      { 
       this.seterror("Name", "Please Input sth"); 
      } 
      else 
       clearerror("Name"); 
      OnpropertyChanged("name"); 
     } 
    } 
} 

Viewmodelbase часть:

class Viewmodelbase : INotifyPropertyChanged, IDataErrorInfo 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public void onpropertychange(string property) 
    { 
     if (string.IsNullOrEmpty(property)) 
      PropertyChanged(this, new PropertyChangedEventArgs(property)); 
    } 

    string IDataErrorInfo.Error 
    { 
     get 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    private Dictionary<string, string> error1 = new Dictionary<string, string>(); 

    public string this[string columnName] 
    { 
     get 
     { 
      if (error1.ContainsKey(columnName)) 
       return error1[columnName]; 
      return null; 

     } 
    } 

    public void seterror(string key1,string value1) 
    { 
     this.error1[key1] = value1; 
     this.onpropertychange("HasError"); 
    } 

    public void clearerror(string key1) 
    { 
     if (this.error1.ContainsKey(key1)) 
     { 
      this.error1.Remove(key1); 
      this.onpropertychange("HasError"); 
     } 
    } 

    protected void ClearErrors() 
    { 
     this.error1.Clear(); 
     this.onpropertychange("HasError"); 
    } 

    public bool HasError 
    { 
     get 
     { 
      return this.error1.Count != 0; 
     } 
    } 


} 

модели представления часть:

class MainWindowViewModel : Viewmodelbase,INotifyPropertyChanged 
{ 
    public Person myboy 
    { 
     get; 
     set; 
    } 
} 

WPF часть:

<TextBox Width="250" FontSize="20" VerticalAlignment="Center" DataContext="{Binding Source={StaticResource VM}}" Text="{Binding Path=myboy.Name,Mode=TwoWay,ValidatesOnDataErrors=True,UpdateSourceTrigger=PropertyChanged,NotifyOnValidationError=True,ValidatesOnExceptions=True}" Name="textbox1" Margin="0,199"></TextBox> 
+0

'певд NotImplementedException();' все facepalms. – Will

ответ

1

C# чувствительный к регистру.

Похоже, что вы используете нижний регистр для имени свойства:

public string name{ get{..} set{..} } 

но вы используете верблюжий при хранении ошибки:

this.seterror("Name", "Please Input sth"); 

Используйте верблюжий для свойств и методов.

даже PropertyName передается seterror гезр cleanerror и Onpropertychanged не соответствует:

clearerror("Name"); 
OnpropertyChange("name"); 

Пожалуйста, следуйте соглашению об именах. соглашение об именах имеет смысл. В следующий раз я не буду беспокоить, чтобы ответить на вопрос, если вы разместите код, как это;)

здесь некоторое вдохновение для вас:

private string _name; //or `private string name;` but I recommend underscore for private fields. 
public string Name{get; set;} 
public Person MyBoy{get; set;} 
public void OnPropertyChanged(string propertyName); //propertyChange and PropertyChanged has different meaning, so use the correct one 
public void SetError(string propertyName, string error){..} //parameter names key and value are useless, they say nothing about what the parameters actually are. 
+0

Вы видели 'throw new NotImplementedException();' в своем коде? Также может возникнуть проблема с его реализацией: | – Will

+0

Не уверен, что это действительно вызвано каркасом WPF, я думаю, нет. В противном случае это сломает программу – Liero

+0

Спасибо за ответ –

Смежные вопросы