这货弄好了可以减少model和view之间映射的代码量,说白了就是后台数据更新自动更新view上的控件内容(一般是listview这类不定子控件数目的控件),所以最好是从刚开始写程序的时候就使用而不是一开始采用人工方法后面再改(会比较头痛)。
这里以DataGrid与数据的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;}
相当于
private int _Id;
public int Id{
get{
return _Id;}
set{
_Id=value;}
}
这先告一段落,下面写出xaml的代码(设置控件大小等视觉效果的属性我就不写了)。
<!-- 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里面设置的ItemsSource相对应的binding。这会需要一些额外的工作(将Items设置为属性以及设定DataContext: xaml binding对应的变量名编译器会直接在Datacontext下面寻找。)。更简单的在办法是直接在InitializeComponent();
后面加上xx.ItemsSource = Items;
其中xx是Datagrid的Name属性。
弄好以后你会发现可以任意添加,删除Items里的Item同时反映到我们的DataGrid上面去。
但是如果对List做出非添加删除的修改(比如打乱排序)和更改某个元素的属性,则并不能反映在上面。下篇文章我会讲一讲如何做到对List的操作都能造成相应control内容的更改。
网友评论