设为首页 收藏本站
查看: 1101|回复: 0

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

[复制链接]

尚未签到

发表于 2015-5-10 09:56:39 | 显示全部楼层 |阅读模式
  做过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的Text属性的值使用了绑定,绑定的源是Silder,绑定的属性是Value,意思是,TextBlock的Text属性的值,来源于Silider的Value属性的值
运行程序,行拖动Silder,效果如下
DSC0000.jpg
  看到,拖动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类声明为静态资源:
  现在修改MainPage.xaml中的TextBlock的Text的内容:。
  上面已经将Binding的Mode设置成了TwoWay,所以我们用代码修改TextBlock的Text属性的值,看看Silder是否跟着变化。
  在Page_Loaded方式中添加一句代码,用来在页面初始化后修改TextBlock的Text属性的值:TargetTB.Text = "40";
运行项目,效果如下
DSC0001.jpg
  我没在Page_Loaded方法中设置了TextBlock的Text值为40,看到Silder的值变成了40,证明Mode=TwoWay起作用了,看到,TextBlock的Text值显示的不是40,而是"获取的值比较小",证明我们的ValueConverter起作用了,那么拖动Silder,使他的值大于50%,我们应该猜到TextBlock的Text值,应该是"获取的值比较大",看看效果是不是
DSC0002.jpg
  接下来我们说说,实际开发中使用更多的,使用数据对象作为数据源
  先添加一个用于提供数据源的类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
{
get
{
return _sex;
}
set
{
_sex = value;
}
}
private int _age;
public int Age
{
get
{
return _age;
}
set
{
_age = value;
}
}
}
  然后为MainPage页面设置数据源



DataSource ds = new DataSource();
DataContext = ds.PersonData;
  在MainPage.xaml页面中添加三个TextBlock,并绑定数据






  运行程序,效果如下
DSC0003.jpg
  上面使用DataContext,DataContext就是表示的数据内容,上面设置的整个页面的数据源,几乎任何空间都有DataContext属性,设置了这个属性,其自己的属性或者子控件的属性就可绑定数据源对象的中属性的值。因为设置了父控件的DataContext之后,其中的所有子控件的DataContext属性默认和父控件一样,除非子控件设置了自己的DataContext。
  绑定格式大同小异:{Binding Source=数据源, Path=属性名}至于Mode和Converter,使用方式与上面介绍控件为数据源一样。Source默认为DataContext,除非不是,否则一般省略不写,Path关键字一般省略,所以最简格式一般为{Binding 属性名}。
  那么我们改变数据看看,看看TextBlock的Text是否改变
  在页面中添加一个按钮,在点击事件中添加代码



Person person = DataContext as Person;
person.Age = 100;
  运行并点击,按钮,效果如下
DSC0004.jpg
  Age没有变成100,这不是我们想要的结果,这事为什么呢
  INotifyPropertyChanged接口
  上面的程序,点击按钮,并没有像我们想象中的那样,显示Age的TextBlock的Text没有改变,这事因为数据改变后,并没有通知UI界面,为什么Silder的Value改变后通知了,我们自己定义的数据没有通知呢,这是因为我们上面定义的Person类没有继承INotifyPropertyChanged,看到这个接口的名字,就知道他是干什么的,通知属性改变,他就是干这个用的。
  用法是直接继承INotifyPropertyChanged,利用PropertyChangedEventHandler添加委托,通知数据已经改变,现在修改Person类



public class Person: INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(PropertyChangedEventArgs args)
{
if (PropertyChanged != null)
PropertyChanged(this, args);
}
private string _name;
public string Name
{
get
{
return _name;
}
set
{
_name = value;
OnPropertyChanged(new PropertyChangedEventArgs("Name"));
}
}
private string _sex;
public string Sex
{
get
{
return _sex;
}
set
{
_sex = value;
OnPropertyChanged(new PropertyChangedEventArgs("Sex"));
}
}
private int _age;
public int Age
{
get
{
return _age;
}
set
{
_age = value;
OnPropertyChanged(new PropertyChangedEventArgs("Age"));
}
}
}
  再次运行程序,点击按钮,效果如下
DSC0005.jpg
  好了,这就是我们想要的结果。
  在最后补充一点东西,我们可以将数据声明为静态资源,然后也可以绑定
  声明静态资源:
  为页面设置数据源:DataContext="{StaticResource data}"
  为控件属性绑定数据






  运行效果和上面是一样的。我之所以留到最后将绑定静态资源,是因为,如果不继承INotifyPropertyChanged接口的数据源,声明为静态资源,绑定后页面中没有数据,这事因为我们按照比较合理的方式编写DataSource类,在构造函数中初始化数据,这样,等于说是声明属性时,没有赋值(为null),而在构造函数中改变数据,由于没有继承INotifyPropertyChanged接口,所以不会通知UI数据以改变(还是null),这就无法显示了,我们需要改写DataSource,在声明PersonData变量时就给他赋值,这样就能显示了,但是这是不好的写法,而且使用了get,set属性访问器,更会出问题,代码丑陋不堪,而我如果不说明,童鞋用了我现在的代码,而无法显示数据,该骂我了,所以我讲完INotifyPropertyChanged,在说绑定静态资源,你继承了INotifyPropertyChanged肯定不会出问题。
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-65403-1-1.html 上篇帖子: Windows Phone 7 软件体系结构 下篇帖子: Windows 7启动卡死
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表