2009-08-31 8 views
2

J'ai un objet lié à un winform et cet objet implémente IDataErrorInfo. J'ai un fournisseur d'erreur. Le problème est quand une propriété d'une propriété change.C# IDataErrorInfo et la propriété enfant

Il n'y a pas de problème lorsque je change l'âge (ie les règles sont vérifiées et affichées/retirées correctement). Mais quand je change le titre du travail, l'erreur n'est pas affichée/supprimée (en effet le titre de propriété n'appartient pas à la personne objet). Comment puis-je effectuer le contrôle?

this.errorProvider1.DataSource = this.bindingSourcePerson; 
bindingSourcePerson.DataSource = new Person(); 
textBoxAge.DataBindings.Add("Text", bindingSourcePerson, "Age"); 
textBoxJobTitle.DataBindings.Add("Text", bindingSourcePerson, "CurrentJob.Title"); 

public class Person : IDataErrorInfo 
{ 
    public double Age { get; set; } 
    private Job _job = new Job(); 
    public Job CurrentJob { get { return _job; } set { _job = value; } } 

    public string this[string columnName] 
    { 
     get 
     { 
      _lastError = ""; 
      switch (columnName) 
      { 
       case "Age": 
       case "CurrentJob.Title": 
        if (!string.IsNullOrEmpty(CurrentJob.Title) && Age < 16) 
         _lastError = "Invalid job."; 
        break; 

       default: _lastError = ""; 
        break; 

      } 
      return _lastError; 

     } 
    } 

    private string _lastError = ""; 
    public string Error 
    { 
     get { return _lastError; } 
    } 

    public class Job 
    { 
     public string Title { get; set; } 
    } 
+0

Si c'était du WPF, j'aurais dit de mettre le datacontext de la zone de texte à CurrentJob et de valider sur ça ... J'aimerais bien le savoir aussi. – Botz3000

Répondre

0

si vous ajoutez une propriété à votre Person classe:

public String CurrentJobTitle { get { return _job.Title; } } 

et se lient alors le TextBoxJobTitle-CurrentJobTitle:

textBoxJobTitle.DataBindings.Add("Text", bindingSourcePerson, "CurrentJobTitle"); 

Ou, lier etc. TextBoxJobTitle-bindingSourcePerson.CurrentJob ceci:

textBoxJobTitle.DataBindings.Add("Text", bindingSourcePerson.CurrentJob, "Title"); 

cela fonctionnera-t-il?

+0

Assez sûr que ça va marcher. Mais ne l'aime pas vraiment et l'objet principal a eu 30-40 "sous-ensemble". – Toto

+0

Si vous souhaitez lier manuellement chaque sous-membre à une zone de texte, vous devez écrire au moins une ligne de code (dur) pour chacun d'entre eux. Même lorsque vous utilisez la réflexion, vous devez écrire quelque part une "liaison" entre une zone de texte et une propriété. Donc je pense que le but est d'atteindre exactement 1 ligne de code (pas que le nombre de lignes soit important, mais parce que c'est codé en dur, ennuyeux à modifier après ça). Pour chacun de votre sous-membre, vous pouvez faire: textBoxSubMember.DataBindings.Add ("Text", mainObject.Submember, "SubmemberProperty"); – manji

Questions connexes