2017-10-10 8 views
0

2つのxamlコード行があります。子へのバインド時にIDataErrorInfoが機能しない

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

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

すべての私のエンティティの基本クラス、IDataErrorInfoおよび彼のインデクサによって、実装されています。

MyEntityChildEntityNestedChildEntityデータベース・エンティティです。 MyEntityのナビゲーションプロパティはChildEntityです。 ChildEntityのナビゲーションプロパティはNestedChildEntityです。 ChildPropertyはChildEntityで必要です。 ChildPropertyは外部キーで、NestedChildEntityはエンティティです。コンボボックスで値を選択しないと、ChildPropertyはnullになります。通常はnullにはできません。

EntityCollectionはタイプの一覧< 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ある

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

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; 
      } 
     } 
    } 
} 

、検証作品、私の基本クラスのインデクサは達し、プロパティ名は、パラメータ(この場合は、「名前」)として送信されている

2番目の行では、検証は行われません。 ChildEntityクラスが(基本クラスを介して)IDataErrorInfoを実装しています。

なぜこのようなネストされたバインディングの動作ですか?回避策を教えてください。

答えて

-1

[OK]を私は最終的に解決策を見つけました。

は以前、私の見解モデルのコンストラクタで、私はそうのような私のMyEntityプロパティを初期化:

MyEntity = new MyEntity(); 

問題がだった私の {Binding Path=MyEntity.ChildEntity.ChildProperty}ChildEntityが MyEntity で初期化されていなかったためという。

私はこのようになりコンストラクタを変更:

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

、すべてが今正常に動作します!

あなたの助けを借りて@ mm8

0

なぜあなたはSelectedItemSelectedValueの両方にバインドしていますか? SelectedValueプロパティは決して設定されません。

これはNestedChildEntityプロパティによって返されるオブジェクトはIDataErrorInfoインタフェースを実装し、このオブジェクトの型がEntityCollection内のアイテムの種類と一致していることをことをあれば動作します:

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

私はよく理解するために私の質問を更新しました。私はSelectedValuePathも使うので、SelectedValueを使用します。私はあなたが示唆するようにSelectedItemにValidatesOnDataErrorsを入れようとしましたが、何もしませんでした –

+0

なぜSelectedItemを使用していますか?あなたの物件のタイプは何ですか? – mm8

+0

正直言って、私は少し冗長だが、それはレガシーコードだと分かっています。コーダーは、これらのプロパティのうちの1つだけが設定されている場合、EntityFrameworkが不平を言っていないことを確認するためにこれを行いました。 EntityCollection = List 。彼らは** ChildProperty **を除くすべてのPOCOです**長い** –

関連する問題