2017-10-10 3 views
0

Ich habe zwei XAML-Code-Zeile.IDataErrorInfo funktioniert nicht beim Binden an Kind

<TextBox Text="{Binding Path=MyEntity.Name, ValidatesOnDataErrors=True}" /> 

und

<ComboBox ItemsSource="{Binding EntityCollection}" 
      SelectedItem="{Binding Path=MyEntity.ChildEntity.NestedChildEntity}" 
      SelectedValue="{Binding Path=MyEntity.ChildEntity.ChildProperty, ValidatesOnDataErrors=True}" 
      SelectedValuePath="PK"/> 

Alle meine Einheiten implementiert, durch eine Basisklasse, IDataErrorInfo und seine Indexer.

MyEntity, ChildEntity und NestedChildEntity sind Datenbankentitäten. MyEntity hat eine Navigationseigenschaft zu ChildEntity. ChildEntity hat eine Navigationseigenschaft zu NestedChildEntity. ChildProperty ist in ChildEntity erforderlich. ChildProperty ist der Fremdschlüssel und NestedChildEntity ist die Entität. Wenn ich keinen Wert in der Combobox auswähle, wäre ChildProperty null und normal Es kann nicht null sein.

EntityCollection ist vom Typ Liste < NestedChildEntity>

MyEntity.cs

public class MyEntity : BaseEntityClass 
{ 
    [Key] 
    [Required] 
    public long PK { get; set; } 
    public string Name { get; set; } 
    public ChildEntity ChildEntity { get; set; } 
} 

ChildEntity.cs

public class ChildEntity : BaseEntityClass 
{ 
    [Key] 
    [Required] 
    public long PK { get; set; } 

    [Required] 
    public long ChildProperty { get; set; } 

    [ForeignKey("ChildProperty")] 
    public NestedChildEntity NestedChildEntity { get; set; } 
} 

NestedChildEntity.cs

BaseEntityClass.cs

public class BaseEntityClass : IDataErrorInfo 
{ 
    public string Error 
    { 
     get 
     { 
      return null; 
     } 
    } 

    public string this[string propertyName] 
    { 
     get 
     { 
      //Check the Required and StringLength attribute 
      var annotationValidationError = GetAnnotationValidationError(propertyName); 

      if (annotationValidationError == null) 
      { 

       return GetValidationError(propertyName); 
      } 
      else 
      { 
       return annotationValidationError; 
      } 
     } 
    } 
} 

Für die erste Zeile, die Validierung funktioniert, wird der Indexer in meiner Basisklasse erreicht und der Eigenschaftsname ist als Parameter senden (in diesem Fall "Name")

Für die zweite Zeile wird die Validierung niemals erreicht. Auch wenn meine ChildEntity Klasse (über eine Basisklasse) IDataErrorInfo implementiert.

Warum ein solches Verhalten mit einer verschachtelten Bindung? Wie kann ich umgehen?

Antwort

-1

Ok ich endlich die Lösung gefunden .

Früher in meiner Ansicht Modellbauer, initialisiert ich meine MyEntity Eigenschaft wie folgt:

MyEntity = new MyEntity(); 

Das Problem war, dass für meine {Binding Path=MyEntity.ChildEntity.ChildProperty}, die ChildEntity in MyEntity nicht initialisiert wurde.

änderte ich den Konstruktor so sein:

MyEntity = new MyEntity { ChildEntity = new ChildEntity() }; 

und alles funktioniert jetzt!

thx für Ihre Hilfe @ mm8

0

Warum sind Sie sowohl an SelectedItem als auch an SelectedValue gebunden? Die SelectedValue Eigenschaft wird nie festgelegt.

Dies sollte funktionieren, vorausgesetzt, dass das Objekt durch die NestedChildEntity Eigenschaft implementiert die IDataErrorInfo Schnittstelle zurückgegeben und dass die Art dieses Objekts entspricht dem Typ der Elemente in der EntityCollection:

<ComboBox ItemsSource="{Binding EntityCollection}" 
     SelectedItem="{Binding Path=MyEntity.ChildEntity.NestedChildEntity, ValidatesOnDataErrors=True}" /> 
+0

Ich habe meine Frage zu einem besseren Verständnis aktualisiert. Ich benutze SelectedValue, weil ich auch SelectedValuePath verwende. Ich habe versucht, ValidatesOnDataErrors auf SelectedItem zu setzen, wie Sie vorschlagen, aber es hat nichts getan –

+0

Also, warum verwenden Sie dann SelectedItem? Und was ist der Typ Ihrer Eigenschaften? – mm8

+0

Um ehrlich zu sein, ich weiß, es ist ein wenig redundant, aber es ist Legacy-Code. Der Programmierer hat dies getan, um sicherzustellen, dass EntityFramework sich nicht beschweren wird, wenn nur eine dieser Eigenschaften gesetzt wurde. EntityCollection = Liste . Sie sind alle POCOs außer ** ChildProperty ** wer ist ein ** lang ** –