Windows Phone 采用了结合MVP和MVC模式的MVVM模式,要求数据进行动态绑定显示,同时将几乎所有操作改为异步方式,以增强用户体验和流畅度,以下是我在开发Windows Phone程序时进行动态绑定的一些经验。
1.集合要用ObservableCollection,该类位于System.Collections.ObjectModel命名空间中,和List有很多相似的地方
初始化:
static ObservableCollection<SongItem> SongData = new ObservableCollection<SongItem>();
2.类的写法:
public class SongItem : INotifyPropertyChanged //首先要继承INotifyPropertyChanged接口,位于System.ComponentModel命名空间
{
public event PropertyChangedEventHandler PropertyChanged; //异步的一个通知事件
private void NotifyPropertyChanged(String propertyName) //实习刚继承的接口中的方法
{
PropertyChangedEventHandler handler = PropertyChanged;
if (null != handler)
{
handler(this, new PropertyChangedEventArgs(propertyName)); //向UI发送值改变的通知
}
}
private string _Title; //用于存储值的私有变量
public string Title //属性
{
get
{
return _Title;
}
set
{
if (value != _Title)
{
_Title = value;
NotifyPropertyChanged("Title"); //这一行必须有,用户向UI通知变化的字段名
}
}
}
}
有人问我类里面的属性为什么必须这样写,原因如下:为了set里调用NotifyPropertyChanged方法,get也不能使用自动的方式,所以这样写(我其实也是从Windows Phone工程自带的例子里看的),说白了,其实就是为了能做到UI能实时获得集合元素中的值改变,从而动态更新显示内容。
3.在xaml里,需要绑定的值,例如TextBlock的Text就可以直接写成
<TextBlock Text={"Binding Title"} />
这样就可以获得相应的DataSource里每一行的Title字段的值,如果找不到也不会报错
前提:在后台代码中要事先声明好容器的数据源
PlayList.ItemsSource = SongData;
4.绑定技巧:
绑定值不但可以是String,int,bool等这种基本的类型,一个类,UI属性(Visibility,Color等)都可以,UI控件的属性值也可以通过动态绑定进行改变,比如Foreground,直接返回string类型的Red,White都是可以的
类里可以这样写
private Visibility _detailvis;
public Visibility detailvis
{
get
{
return _detailvis;
}
set
{
if (value != _detailvis)
_detailvis = value;
NotifyPropertyChanged("detailvis");
}
}
xaml里只需要写成
<TextBlock Visibility="{Binding detailvis}" />
即可实现可见性的绑定
基本控件都是有Tag这个属性的,又因为Tag的类型是Object,所以可以接受所有的类型,绑定一个对象,或者一串有用的数据,在页面跳转等操作时非常有用,当后台使用时,只需用如下操作:
private void StackPanel_Tap_1(object sender, System.Windows.Input.GestureEventArgs e)
{
var s = (StackPanel)sender;
string uri = "/BookDetail.xaml?id=" + s.Tag.ToString();
this.NavigationService.Navigate(new Uri(uri, UriKind.Relative));
}
将sender转换为该控件的类型,即可正确地获得其中的Tag属性,再转换成你需要的类型即可
Windows Phone 的绑定做的还是非常灵活的,能有效地使用绑定,将对程序的用户体验有显著的提高!