数据绑定

通过把TextBox的Value绑定到Slider滚动条

<TextBox Text="{Binding Value,Mode=TwoWay,ElementName=slider1}"/>
<Slider x:Name="slider1"/>

Sliverlight中的数据绑定对被绑定对象有特殊要求,如果只是普通的get、set属性的对象用在数据绑定上有很多问题(无法双向绑定。只有Model值不会变或者Model变了不要求界面跟着变才可以使用普通属性),一般要求类实现INotifyPropertyChange接口。

一般实现后台数据绑定到前台的方法:

//MainPage类中定义
private Person p1 = new Person() { Name="", Age=12};
//在OnNavigatedTo中
txt1.DataContext = p1;
前台:

<TextBox x:Name="txt1" Text="{Binding Name}"/>

Metro中的DependencyObject(依赖对象)没有了事件通知机制,除了系统对象,自定义对象貌似建议使用INotifyPropertyChanged方式

public class Person:INotifyPropertyChanged
{
private string _name;
public string Name
{
get
{
return _name;
}
set
{
_name = value;
if(PropertyChanged != null)
{
PropertyChanged(this,new PorpertyChangedEventArgs("Name"));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
}

为了简化开发,可以自己写一个BindableBase来简化模型类的开发。

CallerMemberName是.Net4.5后新增的一个参数标注,用来传递调用这个方法的方法或者属性名。


绑定模式

三种绑定模式:{Binding Name, Mode = OneTime}

OneTime:一次绑定,绑定创建时使用源数据更新控件。(可以使普通的set、get属性)。

OneWay(默认值):单向绑定,在绑定创建时使用源数据更新控件,当源数据发生变化的时候也更新控件。(必须实现INotifyPropertyChanged接口或者继承自DependencyObject)。相对于Eval

Twoway:双向绑定,数据源的变化会更新控件,控件的变化也会更新数据源。(必须实现INotifyPropertyChanged接口或者继承自DependencyObject)。相当于Bind


子层控件自动继承最近父层控件的数据上下文DataContext:

//MainPage类中定义
private Person p1 = new Person() { Name="abc", Age=12};
//在OnNavigatedTo中
g1.DataContext = p1;//比this.DataContext = p1;优先
前台:

<Grid Name="g1">
<TextBox x:Name="txt1" Text="{Binding Name}"/>
<TextBox x:Name="txt2" Text="{Binding Age}"/>
</Grid >

数据绑定到ListView

<ListView Name="lv1">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBox Text="{Binding Name}"></TextBox>
<TextBlock Text="{Binding Age}"></TextBlock>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>

List<Person> list = new List<Person>();
//放数据
lv1.ItemsSource = list;


或者(前台使用Binding直接绑定数据上下文DataContext)

<ListView Name="lv1" ItemsSource="{Binding}">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBox Text="{Binding Name}"></TextBox>
<TextBlock Text="{Binding Age}"></TextBlock>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>

lv1.DataContext = list;


关于ListView:

SelectionMode属性表示选中模式:None不可选择,Single单选,Multiple多选。

SelectedItem(s)可以获得所有选中的项(如果是手动加入的Items,则值是点击项的Content,如果是数据绑定的则是点击项的DataContext)。

IsItemClickEnabled(默认false)设定点击项的时候是否触发ItemClick事件,ItemClick事件中e.ClickedItem可以得到点击的项(如果是手动加入的Items,则值是点击项的Content,如果是数据绑定的则是点击项的DataContext)。

<ListView Name="lv1" IsItemClickEnabled="True"/>

lv1.ItemClick(object sender, ItemClickEventArgs e)
{
Person p = e.ClickedItem as Person;
}

ListBox类似于ListView,但是没有ListView强大,Win8中不推荐使用ListBox


绑定数据集合

普通的集合的变化不会影响UI的,集合需要实现INotifyCollectionChanged接口

如果使用Oneway、TwoWay以达到数据源发生变化时UI中的项随着数据变化,那么数据可以放到private ObservableCollection<Book> books = new ObservableCollection<Book>(); 因为ObservableCollection中定义了一个集合改变的通知时间。

this.listBox1.ItemsSource = books;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章