当前位置:编程学习 > wap >>

Windows phone 7之数据绑定(Data Bindings)

做过ASP.NET或者Silverlight的童鞋对数据绑定比较熟悉,WP7是基于Silverlight的,silverlight for windows phone页面也是使用XAML,所以页面渲染的原理是一样的。
数据绑定分为源(Source)和目标(Target),Source一般分为两种,其他控件的数据源,或者数据对象。
先说说以控件作为数据源的吧,最简单的格式是:目标控件属性="{Binding ElementName=源控件名, Path=源控件属性}"。
为了便于一会介绍Converter,我放弃使用TextBox作为数据源,转而使用Silvder,免得一会有童鞋挑错。
在页面中放置一个Silder和一个TextBlock,XAML代码如下
Slider Height="84" HorizontalAlignment="Right" Margin="0,41,0,0" Name="MySilder" Value="20" Minimum="0" Maximum="100" VerticalAlignment="Top" Width="450" />
<TextBlock Height="30" HorizontalAlignment="Left" Margin="30,163,0,0" Name="TargetTB" Text="{Binding ElementName=MySilder, Path=Value}" VerticalAlignment="Top" />
看到代码中,TextBlock的Text属性的值使用了绑定,绑定的源是Silder,绑定的属性是Value,意思是,TextBlock的Text属性的值,来源于Silider的Value属性的值
运行程序,行拖动Silder,效果如下

\


看到,拖动Silder时,TextBlock的Text值也会跟着变化,这个Binding的绑定模式Mode有关,Binding默认的Mode是OneWay,单项绑定,也就是说Silder的Value变化时,TextBlock的Text也会变,但是TextBlock的Text变化时Silder的Value不会跟着变,还有两种叫做OneTime和TwoWay,OneTime是绑定依次,也就是TextBlock的Text获取Silder的Value的第一个值,当Silder的Value再次变化时,TextBlock的Text不会变。TwoWay是双向绑定,也就是说改变Silder的Value,TextBlock的Text跟着变,改变TextBlock的Text,Silder的Value也会跟着变。例子在Converter的效果中一起看,暂时不给了。
Converter的作用是数据转换,比如我想要源的数据,但是源的数据格式又不是我想要的,那么我就可以使用Converter来获取我要真正显示的值,Converter改变的只是页面显示出来的值,不贵改变源数据的值。
实现Converter的的方式是定义一个继承自IValueConverter接口,并实现Convert和ConvertBack方法,现在我们在项目中添加一个类,代码如下
public class ValueConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            string strValue = "";
            double doubleValue = (double)value;
            if (doubleValue > 50)
                strValue = "获取的值比较大";
            else
                strValue = "获取的值比较小";
            return strValue;
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value;
        }
    }
然后还要将该类添加到静态资源中,以便使用,在App.xaml中添加当前项目中的命名空间:xmlns:local="clr-namespace:DataBindings"
然后将ValueConverter类声明为静态资源:<local:ValueConverter x:Key="valueConverter" />
现在修改MainPage.xaml中的TextBlock的Text的内容:<TextBlock Height="30" HorizontalAlignment="Left" Margin="30,163,0,0" Name="TargetTB" Text="{Binding ElementName=MySilder, Path=Value, Mode=TwoWay, Converter={StaticResource valueConverter}}" VerticalAlignment="Top" />。
上面已经将Binding的Mode设置成了TwoWay,所以我们用代码修改TextBlock的Text属性的值,看看Silder是否跟着变化。
在Page_Loaded方式中添加一句代码,用来在页面初始化后修改TextBlock的Text属性的值:TargetTB.Text = "40";
运行项目,效果如下

 
我没在Page_Loaded方法中设置了TextBlock的Text值为40,看到Silder的值变成了40,证明Mode=TwoWay起作用了,看到,TextBlock的Text值显示的不是40,而是"获取的值比较小",证明我们的ValueConverter起作用了,那么拖动Silder,使他的值大于50%,我们应该猜到TextBlock的Text值,应该是"获取的值比较大",看看效果是不是

接下来我们说说,实际开发中使用更多的,使用数据对象作为数据源
 
先添加一个用于提供数据源的类DataSource和Person,代码如下
public class DataSource
    {
        private Person _personData;
        public Person PersonData
        {
            get
            {
                return _personData;
            }
            set
            {
                _personData = value;
            }
        }
        public DataSource()
        {
            PersonData = new Person()
            {
                Name = "DHC",
                Sex = "男",
                Age = 27
            };
        }
    }
    public class Person: INotifyPropertyChanged
    {
        private string _name;
        public string Name
        {
            get
            {
                return _name;
            }
            set
            {
                _name = value;
            }
        }
        private string _sex;
        public string Sex<

补充:移动开发 , Windows Phone ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,