今天寫一個wpf的demo,用到綁定數據,給控件綁定了數據源,可是數據卻沒有顯示出來,排查代碼發現綁定數據源的的成員用的是字段不是屬性。前端
前端代碼:編程
<Grid> <StackPanel Grid.Row="2" Margin="10"> <ListBox x:Name="listBox" Height="100"> </ListBox> </StackPanel> </Grid>
後臺代碼:安全
public Window3() { InitializeComponent(); List<Employe> list = new List<Employe>() { 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;數據就沒法綁定了。緣由是屬性的訪問是由訪問器完成的,於是屬性能夠進行數據綁定。this
網上的文章有不少,可是好些沒說到重點,基本都是說屬性能夠保護數據安全云云之類,整理了一下,有一下幾個區別:spa
相同點:
都是類的成員,屬性是類的屬性,而字段是類的數據成員
不一樣點:
1 屬性可進行數據綁定
2 屬性可經過set和get方法進行數據安全性檢驗,而字段不行
3 屬性可進行線程同步
public string Name
{
set{
lock(this)
{
}
}
}
4 屬性能夠是抽象的,而字段不行
5 屬性能夠接口的形式表現
6 基於屬性的索引
7 不要直接把字段轉化爲屬性線程
MSDN:code
屬性與字段對象
屬性與字段均可在對象中存儲和檢索信息。它們的類似性使得在給定狀況下很難肯定哪一個是更好的編程選擇。
在如下狀況下使用屬性過程:
1. 須要控制設置或檢索值的時間和方式時。
2. 屬性有定義完善的一組值須要進行驗證時。
3. 設置值致使對象的狀態發生某些明顯的變化(如 IsVisible 屬性)。
4. 設置屬性會致使更改其餘內部變量或其餘屬性的值時。
5.必須先執行一組步驟,而後才能設置或檢索屬性時。
在如下狀況下使用字段:
1. 值爲自驗證類型時。例如,若是將 True 或 False 之外的值賦給 Boolean 變量,就會發生錯誤或自動數據轉換。
2. 在數據類型所支持範圍內的任何值均有效時。Single 或 Double 類型的不少屬性屬於這種狀況。
3. 屬性是 String 數據類型,且對於字符串的大小或值沒有任何約束時blog