1

学生班

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

List<SubjectInfo>对于不同的学生,列表可以有不同数量的SubjectInfo对象。

SubjectInfo 结构

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

我想在窗口上显示学生对象的详细信息。由于List有不同数量的对象计数,我使用ItemsControl并使用了 dataTemplate。

绑定学生对象非常有效。

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

通过分配 a SubjectInfoto DataContext,它被复制(因为它是struct/ ValueType),这就是绑定不起作用的原因。在大多数情况下,这不是您想要的。我建议你改用一个类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) 之间进行转换。
  • 结构的含义this不同(第 7.6.7 节)。
  • 不允许结构的实例字段声明包含变量初始值设定项(第 11.3.7 节)。
  • 不允许结构声明无参数实例构造函数(第 11.3.8 节)。
  • 不允许结构声明析构函数(第 11.3.9 节)。
于 2013-01-31T07:13:58.683 回答
1

Struct 是一种值类型,绑定将获得它的副本,因此永远不会更新原始对象。

于 2013-01-31T07:14:13.800 回答