這貨弄好了可以減少model和view之間映射的代碼量唆鸡,說白了就是后臺(tái)數(shù)據(jù)更新自動(dòng)更新view上的控件內(nèi)容(一般是listview這類不定子控件數(shù)目的控件)涝影,所以最好是從剛開始寫程序的時(shí)候就使用而不是一開始采用人工方法后面再改(會(huì)比較頭痛)。
這里以DataGrid與數(shù)據(jù)的binding為例争占。ListView或者其他的控件可以類推燃逻。
出于易讀性考慮,這里先給出c#代碼然后再解釋xaml代碼臂痕。
// Main.xaml.cs
public partial class MainWindow : Window
{
public List<Item> Items { get; set; }
public MainWindow()
{
InitializeComponent();
Items = new List<Item>();
this.DataContext = this;
items.Add(new Item { IsChecked = false, Id = 1, Name = "PC", Cost = 1000 });
items.Add(new Item { IsChecked = false, Id = 2, Name = "Phone", Cost = 500 });
}
}
// Item.cs
public class Item{
public bool IsChecked{get;set;}
public int Id{get;set;}
public string Name{get;set;}
public int Cost{get;set}
}
這里稍微解釋一下伯襟,public int Id{get;set;}
相當(dāng)于
private int _Id;
public int Id{
get{
return _Id;}
set{
_Id=value;}
}
這先告一段落,下面寫出xaml的代碼(設(shè)置控件大小等視覺效果的屬性我就不寫了)握童。
<!-- Main.xaml -->
<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsChecked}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Id" Binding="{Binding Id}"/>
<DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
<DataGridTextColumn Header="Cost" Binding="{Binding Cost}"/>
</DataGrid.Columns>
</DataGrid>
注意到這里是直接在xaml里面設(shè)置的ItemsSource相對(duì)應(yīng)的binding姆怪。這會(huì)需要一些額外的工作(將Items設(shè)置為屬性以及設(shè)定DataContext: xaml binding對(duì)應(yīng)的變量名編譯器會(huì)直接在Datacontext下面尋找。)澡绩。更簡單的在辦法是直接在InitializeComponent();
后面加上xx.ItemsSource = Items;
其中xx是Datagrid的Name屬性稽揭。
image
弄好以后你會(huì)發(fā)現(xiàn)可以任意添加,刪除Items里的Item同時(shí)反映到我們的DataGrid上面去肥卡。
但是如果對(duì)List做出非添加刪除的修改(比如打亂排序)和更改某個(gè)元素的屬性溪掀,則并不能反映在上面。下篇文章我會(huì)講一講如何做到對(duì)List的操作都能造成相應(yīng)control內(nèi)容的更改召调。