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?
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 –
Also, warum verwenden Sie dann SelectedItem? Und was ist der Typ Ihrer Eigenschaften? – mm8
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 ** –