Windows Phone 7天初学(4):数据绑定

来源:互联网 时间:1970-01-01

数据绑定提供了一种数据呈现与交互的简捷方式,使得数据与UI分离,并能自动更新、同步。

绑定有绑定目标、绑定源、绑定模式、转换器等要素。。

绑定目标为Silverlight控件,可以是FrameworkElement类型的对象,实际上绑定的是该控件的一个特定属性。

绑定源为数据对象,也可以是任意的CLR对象。

转换器:进行数据类型或格式的转换。

绑定模式,三种模式的数据绑定。

( 1)OneTime:一次绑定,在绑定创建时使用源数据更新目标,适用于只显示数据而不进行数据的更新。

(2)OneWay:单向绑定,在绑定创建时或者源数据发生变化时更新到目标,适用于显示变化的数据。

(3)TwoWay:双向绑定,在任何时候都可以同时更新源数据和目标。

当模式为OneWay或TwoWay时,源对象必须实现INotifyPropertyChanged接口。

绑定源的方式有:

(1) Source:表示绑定源对象。

(2) RelativeSource,指定绑定源相对于绑定目标的位置来标识绑定源。

(3) ElementName,绑定源也是UI对象。

可以在C#代码中,也可以在XAML声明中进行绑定,现列举常见的几种绑定方式:

(1) 绑定源为UI对象。

通过slider的值来控制矩形控件图形的宽度。

<Slider Name="slider" Value="20" Maximum="200" />

<Rectangle ;{Binding Path=Value,Mode=OneWay,ElementName=slider}" /> 

Mode默认为OneWay, “Path=”也可可省略,因此上式还可简写为:

<Rectangle ;{Binding Value,ElementName=slider}" />

(2) C#代码中实现绑定

定义数据源:

Public class Classmate

{public string cName{get;set;}
public int cAge{get;set;}
}

创建同学类的实例作为绑定源:

Public Classmate myClassmate=new Classmate
{
cName=“王根山“,
cAge=”29”
};
Binding bd=new Binding();
Bd.Source= myClassmate;
bd.Path=new PropertyPath(“cName”);
bd.SetBinding(TextBox.TextProperty,cTextBox);

多个控件绑定同一数据源,可统一指定数据源,用DataContext来实现,原数据源赋值语句均可省略。

Canvas1.DataContext= myClassmate;

(3) XAML声明中实现绑定

添加命名空间的支持:

xmlns:local="clr-namespace:WindowsPhoneApplication4"

资源项中实例化类:

<phone:PhoneApplicationPage.Resources>
<local:Classmate x:Key="dataClass" cName="万常山" cAge="28"></local:Classmate>
</phone:PhoneApplicationPage.Resources>

在XAML中实现绑定:

<TextBox Name=“cTextBox” Text=“{Binding path= cName,Mode=OneWay }” />

也可以如同C#代码中实现绑定,在C#代码中定义数据源:

Canvas1.DataContext= myClassmate;

(4) 使用数据绑定设计器实现绑定

除了C#、XAML来实现绑定,还可借助于Visual Studio的可视化工具,直接实现绑定,实际是XAML实现绑定的可视化方式,自动生成XAML代码。

在属性面板中单击属性右侧的小图标,会弹出菜单,如图4-1所示:

 

图4-1

在弹出菜单中选择Apply Data Binding..,会出现数据绑定设计器,可定义Source、Path等属性,如图4-2:

 

 

图4-2

案例4-1:数据绑定实现

集合对象的数据绑定,用自定义模板方式实现。

(1)创建Windows Phone程序。

(2)添加新类Classmate

public class Classmate
{
public int cId { get; set; }
public string cName { get; set; }
public int cAge { get; set; }
}

(4) XAML页面绑定代码如下:

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<ListBox Height="297" ItemsSource="{Binding}" HorizontalAlignment="Left" Margin="35,35,0,0" Name="listBox1"
 VerticalAlignment="Top" ;357" >
<ListBox.ItemTemplate >
<DataTemplate >
<StackPanel Height="50" HorizontalAlignment="Center" ;480" VerticalAlignment="Top" Orientation="Horizontal" >
<TextBlock Height="60" HorizontalAlignment="Left" Text="{Binding cId}" VerticalAlignment="Top" ;100" />
<TextBlock Height="60" HorizontalAlignment="Left" Text="{Binding cName}" VerticalAlignment="Top" ;100" />
<TextBlock Height="60" HorizontalAlignment="Left" Text="{Binding cAge}" VerticalAlignment="Top" ;100" />
</StackPanel>
</DataTemplate> 
</ListBox.ItemTemplate>
</ListBox>
</Grid>

(5) 在C#代码中定义数据源:

ObservableCollection<Classmate> classmates=new ObservableCollection<Classmate> 
{
new Classmate {cId=1,cName ="王启大",cAge=28},
new Classmate {cId=2,cName ="万正领",cAge=25},
};
public MainPage()
{
InitializeComponent();
listBox1.DataContext = classmates;
}

(6)F5运行,效果如下:

 

 

源码下载

本文出自 “蓝海战术” 博客,请务必保留此出处http://wanxl.blog.51cto.com/2129901/582105


相关阅读:
Top