wpf中的类与结构绑定问题

时间:2013-01-31 07:10:03

标签: wpf data-binding

学生班

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

List<SubjectInfo>列表可以为不同的学生提供不同数量的SubjectInfo个对象。

SubjectInfo struct

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

我想在窗口上显示学生对象的详细信息。由于列表具有不同数量的对象计数,因此我使用了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类,则可以正常工作。

无法理解为什么。请指教。

2 个答案:

答案 0 :(得分:4)

通过将SubjectInfo分配给DataContext,它会被复制(因为它是struct / ValueType),这就是绑定不起作用的原因。在大多数情况下,这不是你想要的。我建议您使用SubjectInfo的课程代替。

您应该了解classstruct之间的差异。 C# Specification (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节)。

答案 1 :(得分:1)

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