我将对象列表绑定到ComboBox。
<ComboBox Name="comboPerson" DisplayMemberPath="Name"/>
后面的代码如下所示:
List<Person> myFriends = new List<Person>()
{
new Person("Jack", "Daniels", 8),
new Person("Milla", "Jovovovich", 35),
new Person("Umma", "Turman", 34)
};
comboPerson.ItemsSource = myFriends;
如果我使用标准属性,它不会显示名称,但是,如果通过get访问器访问该属性,则它正在运行。这就是我的意思:
工作版:
public string Name { get; set; }
public string Surnamge { get; set; }
public int Age { get; set; }
public Person(string name, string surname, int age)
{
this.Name = name;
this.Surnamge = surname;
this.Age = age;
}
非工作版本:
public string Name;
public string Surnamge;
public int Age;
public Person(string name, string surname, int age)
{
this.Name = name;
this.Surnamge = surname;
this.Age = age;
}
问题是:为什么WPF无法从标准属性中获取值?
答案 0 :(得分:2)
您的“非工作”版本不使用“属性”,它使用公共字段,您通常不应该使用这些字段,因为它违反了Encapsulation。
WPF的设计使它只能通过访问者访问属性。字段不是通过访问器访问的(如果使用{get;set;}
语法,则由编译器生成),但是直接访问。如果您使用属性,您还可以利用自动更新等优点(如果您正确实施INotifyPropertyChanged
)。
因此,如果要在WPF中使用Binding,则需要使用属性。
答案 1 :(得分:1)
第二个代码不包含标准属性,它包含字段。 WPF需要属性,你也应该实现INotifyPropertyChanged
,否则wpf将不会捕获更改的数据。
另一方面:不要直接公开字段,将它们封装在属性中。这样做,你可以控制进入类的数据,类本身之外的代码也不会以非想要的方式影响类。