SliverLight for window phone 开发中的数据绑定主要是把数据源绑定显示到控件中,控件可能是单一数据控件,也可能是数据集合控件。
绑定主要是把数据源和数据目标组合到一起。
目标待绑定的属性必须是dependencyProperty依赖属性
1.控件和单数据绑定
添加一个TextBlock控件。
<TextBlock x:Name="tb1" Foreground="Blue" Text="{Binding}">
文本控件的属性Text用来绑定显示数据,{Binding}表示绑定数据源,
但是数据源我们在cs代码部分 设置。
定义的MusicRecord类,文本控件显示这个MusicRecord的数据信息
public class MusicRecord
{
public MusicRecord(string name, string music)
{
this.Name = name;
this.Music = music;
}
public string Name
{
get;
set;
}
public string Music
{
get;
set;
}
//重写ToString方法
public override string ToString()
{
return "Override" + this.Name + "__" + this.Music;
}
}
在页面的加载方法中添加下面的代码
MusicRecord music = new MusicRecord("王菲","因为爱情");
this.tb1.DataContext = music;
运行程序以后文本控件Textblock显示“Overrid王菲__因为爱情“。
文本控件<TextBlock x:Name="tb1" Foreground="Blue" Text="{Binding}">中的绑定中没有指定数据源的具体某个属性,只是写了{Binding}那么Textblock默认
就会去读取这个数据源的ToString()方法,所以我们重写了ToString()方法,把数据另外两个属性输出。
如果绑定的时候指定了具体的属性,就不会调用ToString()方法
<TextBlock x:Name="tb1" Foreground="Blue" Text="{Binding Name}">如此就会输出”王菲“
2.绑定控件和集合数据对象
更多的时候是绑定数据集合到一个控件中,下面的例子使用ObservableCollection,表示一个动态数据集合,在添加项、移除项或刷新整个列表时,此集合将提供通知。这个类继承了INotifyCollectionChanged, INotifyPropertyChanged。
添加下拉框控件
<ComboBox x:Name="ComboBox1" ItemsSource="{Binding}" Foreground="Black" FontSize="18" Height="50" Width="400"/>
添加cs页面加载事件代码
public ObservableCollection<MusicRecord> MyMusic = new ObservableCollection<MusicRecord>();
MyMusic.Add(new MusicRecord("王菲","因为爱情"));
MyMusic.Add(new MusicRecord("陈奕迅", "浮夸"));
MyMusic.Add(new MusicRecord("李佳璐", "无法原谅"));
MyMusic.Add(new MusicRecord("周杰伦", "青花瓷"));
this.ComboBox1.DataContext = MyMusic;
这样就可以把MyMusic集合对象绑定到ComboBox控件中,因为ItemsSource="{Binding}" ,所以遍历到单个数据的时候仍然会去绑定ToString方法。
3.在控件红使用数据模板显示数据
例子2中的绑定数据是使用Tostring()的默认方法,不能灵活的定义显示到控件上的内容和样式。
通过使用数据模板,可以定义数据在控件中显示数据和显示样式。
一般有两个形式,使用内容控件的ContentTemplate和集合控件的ItemTemplate。
<ComboBox x:Name="ComboBox1" ItemsSource="{Binding}" FontSize="18" Height="200" Width="400">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Margin="2">
<TextBlock Text="Name:" Margin="2" />
<TextBlock Text="{Binding Name}" Margin="2" />
<TextBlock Text="Music:" Margin="10,2,0,2" />
<TextBlock Text="{Binding Music}" Margin="2" />
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
4.绑定控件时的数据转换处理
在绑定数据时候很多情况下,要对数据做些处理,比如数据源可能是加密数据,绑定显示的时候要解密出来,或者数据源是个日期格式,显示的时候用不同的格式
来显示。这个时候就需要在展现的时候做转换处理,而不是对数据源做修改。
之前有个文章说明过这个过程。
5.控件和控件之间的绑定
某些情况下控件的数据源是另外一个控件的属性,比如Textblock控件的数据Text属性会和Slider控件绑定,实时显示Slider的Value属性
代码如下:提供了两种方式
这个模式下ElementName指定数据源控件的Name,Path指定数据源控件的数据属性
如果Path=value在前面,可以忽略“Path=”,直接写Value
Text="{Binding ElementName=slider, Path=Value}"
<Slider Name="slider" Width="450" Height="30" Margin="24" Background="White" Foreground="Blue" Value="90" Maximum="180" ></Slider>
<TextBlock Width="400" Height="50">
<TextBlock.Text>
<Binding ElementName="slider" Path="Value"></Binding>
</TextBlock.Text>
</TextBlock>
<TextBlock Width="400" Height="50" Text="{Binding ElementName=slider, Path=Value}" > </TextBlock>
或者使用cs代码的方式
Binding binding = new Binding();
binding.ElementName = "slider";
binding.Path = new PropertyPath("Value");
tb1.SetBinding(TextBlock.TextProperty, binding);
//或者使用下面的方式
//BindingOperations.SetBinding(tb1, TextBlock.TextProperty, binding);
6.数据绑定的模式
首先数据绑定的时候,绑定的目标属性必须是依赖属性,
而且数据绑定模式有三种
// 摘要:
// 描述数据如何在绑定中传播。
public enum BindingMode
{
// 摘要:
// 创建绑定时更新目标属性。对源对象的更改也会传播到目标。
OneWay = 1,
//
// 摘要:
// 创建绑定时更新目标属性。
OneTime = 2,
//
// 摘要:
// 在进行任一更改时会相应更新目标或源对象。创建绑定后,目标属性从源进行更新。
TwoWay = 3,
}