今天写一个wpf的demo,用到绑定数据,给控件绑定了数据源,但是数据却没有显示出来,排查代码发现绑定数据源的的成员用的是字段不是属性。
前端代码:
后台代码:
public Window3() { InitializeComponent(); Listlist = new List () { new Employe() { name="jack",age=18}, new Employe() { name="bob",age=20}, new Employe() { name="alice",age=21} }; listBox.ItemsSource = list; listBox.DisplayMemberPath = "name"; listBox.SelectedValuePath = "age"; }
//实体 public class Employe { public string name { get; set; } public int age { get; set; } }
如果把Employe的name,去掉{get;set;},改为一个字段, public string name;数据就无法绑定了。原因是属性的访问是由访问器完成的,因而属性可以进行数据绑定。
网上的文章有很多,但是好些没说到重点,基本都是说属性可以保护数据安全云云之类,整理了一下,有一下几个区别:
相同点:
都是类的成员,属性是类的属性,而字段是类的数据成员不同点:1 属性可进行数据绑定2 属性可通过set和get方法进行数据安全性检验,而字段不行3 属性可进行线程同步public string Name{ set{ lock(this) { } }}4 属性可以是抽象的,而字段不行5 属性可以接口的形式表现6 基于属性的索引7 不要直接把字段转化为属性
MSDN:
属性与字段
属性与字段都可在对象中存储和检索信息。它们的相似性使得在给定情况下很难确定哪个是更好的编程选择。在以下情况下使用属性过程: 1. 需要控制设置或检索值的时间和方式时。 2. 属性有定义完善的一组值需要进行验证时。 3. 设置值导致对象的状态发生某些明显的变化(如 IsVisible 属性)。 4. 设置属性会导致更改其他内部变量或其他属性的值时。 5.必须先执行一组步骤,然后才能设置或检索属性时。在以下情况下使用字段: 1. 值为自验证类型时。例如,如果将 True 或 False 以外的值赋给 Boolean 变量,就会发生错误或自动数据转换。 2. 在数据类型所支持范围内的任何值均有效时。Single 或 Double 类型的很多属性属于这种情况。 3. 属性是 String 数据类型,且对于字符串的大小或值没有任何约束时