wpf 中的类与结构绑定问题

New*_*per 1 data-binding wpf

学生班

public class Student
{
    string name;        
    List<SubjectInfo> subjectInfoList;    
    ....
}
Run Code Online (Sandbox Code Playgroud)

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

主题信息结构体

public struct SubjectInfo
{
    string subjectCode;
    int marks;
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

绑定学生对象效果非常好。

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

但此TwoWay绑定不起作用SubjectInfo(从 UI 更改值不会被代码隐藏捕获),
但如果将SubjectInfo 结构更改为SubjectInfo 类,则它可以工作。

无法理解为什么。请给我建议。

Bot*_*000 5

通过将 a 分配SubjectInfoDataContext,它会被复制(因为它是 / structValueType,这就是绑定不起作用的原因。在大多数情况下这不是您想要的。我建议你使用一个类来SubjectInfo代替。

\n\n

class您应该了解和之间的差异struct。C # 规范 (V4.0)对它们进行了如下总结(第 11.3 节):

\n\n
    \n
  • 结构是值类型 (\xc2\xa711.3.1)。
  • \n
  • 所有结构类型都隐式继承自类System.ValueType(\xc2\xa711.3.2)。
  • \n
  • 对结构类型变量的赋值会创建所赋值值的副本(\xc2\xa711.3.3)。
  • \n
  • 结构体的默认值是通过将所有值类型字段设置为其默认值并将所有引用类型字段设置为 (\xc2\xa711.3.4) 生成的值null
  • \n
  • 装箱和拆箱操作用于在结构类型和object(\xc2\xa711.3.5) 之间进行转换。
  • \n
  • this对于结构 (\xc2\xa77.6.7),的含义有所不同。
  • \n
  • 结构的实例字段声明不允许包含变量初始值设定项 (\xc2\xa711.3.7)。
  • \n
  • 不允许结构声明无参数实例构造函数 (\xc2\xa711.3.8)。
  • \n
  • 结构体不允许声明析构函数 (\xc2\xa711.3.9)。
  • \n
\n