1

学生クラス

public class Student
{
    string name;        
    List<SubjectInfo> subjectInfoList;    
    ....
}

List<SubjectInfo>リストには、SubjectInfo生徒ごとに異なる数のオブジェクトを含めることができます。

SubjectInfo 構造体

public struct SubjectInfo
{
    string subjectCode;
    int marks;
    ...
}

ウィンドウに学生オブジェクトの詳細を表示したいと考えています。リストにはさまざまな数のオブジェクト カウントがあるため、ItemsControldataTemplate を使用しました。

学生オブジェクトのバインドは完全に機能します。

Student student = new Student("Joe", new List<SubjectInfo>() { new SubjectInfo("Subject1", 50), new SubjectInfo("Subject2", 70) });  
StudentGrid.DataContext = student;  

しかし、このTwoWayバインディングは機能しませんSubjectInfo(UI からの値の変更は分離コードによってキャッチされません) 。
ただし、SubjectInfo 構造体SubjectInfo クラスに変更すると機能します。

理由がわかりません。私に助言してください。

4

2 に答える 2

4

SubjectInfoに aを割り当てるとDataContext、コピーされます ( struct/であるためValueType)。そのため、バインディングが機能しません。これはほとんどの場合、あなたが望むものではありません。代わりにクラス for を使用することをお勧めしますSubjectInfo

と の違いに注意してclassくださいstructC# 仕様 (V4.0) では、次のように要約されています (セクション 11.3)。

  • 構造体は値型です (§11.3.1)。
  • すべての構造体型はクラスから暗黙的に継承されますSystem.ValueType(§11.3.2)。
  • 構造体型の変数への代入は、代入される値のコピーを作成します (§11.3.3)。
  • 構造体のデフォルト値は、すべての値型フィールドをデフォルト値に設定し、すべての参照型フィールドをnull(§11.3.4) に設定することによって生成される値です。
  • ボックス化およびボックス化解除操作は、構造体型とobject(§11.3.5) の間の変換に使用されます。
  • isの意味は、構造体でthisは異なります (§7.6.7)。
  • 構造体のインスタンス フィールド宣言に、変数初期化子を含めることは許可されていません (§11.3.7)。
  • 構造体は、パラメーターなしのインスタンス コンストラクターを宣言することはできません (§11.3.8)。
  • 構造体でデストラクタを宣言することは許可されていません (§11.3.9)。
于 2013-01-31T07:13:58.683 に答える
1

構造体は値型であり、バインディングはそのコピーを取得するため、元のオブジェクトを更新することはありません。

于 2013-01-31T07:14:13.800 に答える