通过把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;
<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;
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;