接着上一篇来侃。

二.实体到控件之间的绑定

  这儿不知道用实体这个词恰不恰当,凑活着理解就行了。他可以是一个类实例,也可以是一个集合。

  所以,相应的我们就引入两个Demo,第一个介绍用简单的类作为作为数据源,第二个就介绍用一个集合作为数据源

  废话不多说,来看demo,我先上代码,后上分析

  DEMO1:

  XAML页面

    <Page.Resources>
<local:User x:Key="user"></local:User>
</Page.Resources>
<Grid>
<StackPanel DataContext="{StaticResource user}" HorizontalAlignment="Center">
<TextBlock x:Name="tbID" Text="{Binding Path=ID}"></TextBlock>
<TextBlock x:Name="tbName" Text="{Binding Path=Name}"></TextBlock >
<TextBlock x:Name="tbGender" Text="{Binding Path=Gender}"></TextBlock>
</StackPanel>
</Grid>

  

User类:

  public class User
{
public int ID{get;set}
public string Name{get;set}
public string Gender{get;set;}
}

C#代码:

  public sealed partial class MyPage : Page
{
public MyPage()
{
this.InitializeComponent();
User user=Resources["user"] as User;
if (user != null)
{
user.ID = ;
user.Name = "CQ";
user.Gender = "不明";
}
}
}

  上面两坨就是全部代码了,在这儿我说一下执行大概流程。

  在执行MyPage类的构造函数时,我们通过User user=Resources["user"] as User拿到定义在MyPage页面中的静态资源User类的实例,然后对其赋值,运行程序后,我们发现控件上显示出来了

  我们赋值的数据。

  其实,我们在xaml中定义了三个TextBlock控件用来显示User类中的三个属性,但是我们只在他们的binding中只声明了Path,并没有指定ElementName,也就是数据源,这时候他们会查找他们的父级

  元素的数据源,这个数据源必须含有ID,User,Gender三个属性。而在他们的父级元素StackPanel中定义了属性DataContext(数据上下文),它在这儿指明了数据源,是谁呢?就是“user”,它定义在静态

  资源中。然后在MyPage类的构造函数中,拿到了类User的实例,为他赋值后,最后通过数据绑定的技术,他们最终显示在屏幕上!注意:当他们显示后,如果人为修改了user类中的属性值,这种改变是

不会在界面上显示出来的。如果想让它跟着变该怎么办?往下看!

  在Demo1中的代码实际是没有啥实际用途的,想要有用途的,我们把它改造一下!!!

  之前说了,我们需要在User类实例的属性值发生改变后,让改变后的数据也显示在界面上。所以做如下改动!只需要改动User类就可以了!

  

  public class User : INotifyPropertyChanged
{
private int _id;
private string _name;
private string _gender;
public int ID
{
get
{
return _id;
} set
{
_id = value;
OnPropertyChanged();
}
} public string Name
{
get
{
return _name;
} set
{
_name = value;
OnPropertyChanged();
}
} public string Gender
{
get
{
return _gender;
} set
{
_gender = value;
OnPropertyChanged();
}
} public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged([CallerMemberName]string propertyName="")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}

  其实理解还是比较简单。试想,提供一种机制,在user属性改变后,就通知系统说“我的值变了,你丫赶紧给我再界面上表达出来”,那么这个机制就通过让User继承INotifyPropertyChanged这个

  接口来实现。

  对比这个类和之前的,除了实现了接口INotifyPropertyChanged接口外,还定义了一个公共方法OnPropertyChanged,其次所有的属性的set方法里加了OnPropertyChanged()方法,用来通知

  属性值发生了改变。

  提示小技巧:CallerMemberName特性的作用是在调用OnPropertyChanged方法时,把属性的名称作为参数传进入,如果不加的话,在调用时就需要手动输入属性名称,这样出错的几率就比较大!

  置于INotifyPropertyChanged的真正内部原理,请msdn!...其实是我不太懂!

  好了,做了如上一番修改后,就是先我们需要的功能了!

DEMO2

  这次我们玩个有用的,吧一个集合中的数据绑定到一个列表中!

  先上代码!!!

  xaml:

    <StackPanel>
<Button Content="改变" Click="Button_Click"></Button>
<ItemsControl x:Name="itemsControl" ItemsSource="{Binding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding ID,Mode=OneWay}"/>
<TextBlock Text="{Binding Name,Mode=OneWay}" ></TextBlock>
</StackPanel>
</DataTemplate> </ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>

  product:

  public class Product
{
private int _id;
private string _name;
public int ID
{
get { return _id; }
set
{
_id = value;
}
}
public string Name
{
get { return _name; }
set
{
_name = value;
}
}
}

  c#:

  

  public sealed partial class MyPage : Page
{
List<Product> list = null;
public MyPage()
{
this.InitializeComponent(); list = new List<Product>
{
new Product { ID=,Name="土豆" },
new Product{ ID=,Name="马铃薯"},
new Product{ ID=,Name="洋芋"} }; itemsControl.ItemsSource = list;
} private void Button_Click(object sender, RoutedEventArgs e)
{
if (list != null)
{
list.Add(new Product { ID = , Name = "Potato" });
}
}
}

  

  这是运行结果。先不要在意那个“改变”按钮。

  这次定义了一个ItemsControl列表控件,并且对其ItemTemplate 定义了一个模板,知识还是数据绑定。不懂可以看我的这篇文章DataTemplate和ControlTemplate联系与区别

  然后定义了一个泛型集合List<Product>,添加了三条数据后,把它设置为ItemsControl的数据源,注意这儿不用DataContext设置,用ItemSource属性!(而这区别可以百度!)

  之后运行程序,发现数据已经成功显示在界面上了。

  到这儿,已经实现了如何把一个集合中的数据显示在一个列表控件中!

  而的“改变”按钮的作用是想List中添加一条数据,但在点击后,界面上并没有反应,但是通过调试发现,数据的确添加到了List中,知识没有显示出来而已,结合我们之前一篇博文,

  应该能猜到,这儿缺少某种通知机制。当我们把List<Product>换为ObservableCollection<Product>后,会发现能够改变数据了。

  通过查看定义发现ObservableCollection<T>实现了接口INotifyCollectionChanged, INotifyPropertyChanged,正是这两个接口提供了这种通知机制!

至此。我的心得就完了。。但总感觉讲的不够,不清楚。以后把其中的小技巧在发篇博文谈谈。

  

[uwp开发]数据绑定那些事(2)的更多相关文章

  1. [uwp开发]数据绑定那些事(1)

    现在是msp候选人,是时候写点技术博客来加分了(实则是个人的心得体会). 注:以下都是个人理解,错误在所难免,欢迎批评指正 以前接触过WPF,只会简单的一些操作,现在在逐渐学习UWP(Universa ...

  2. uwp开发:数据绑定——值转换器 的简单使用

    原文:uwp开发:数据绑定--值转换器 的简单使用 今天,我在做最近正在开发的“简影”uwp应用时遇到一个问题,其中有个栏目,叫做“画报”,是分组显示一组一组的 图片,每组图片在界面上只显示9个,点击 ...

  3. UWP开发小结

    做了两天的UWP开发,上手还是挺快的,不过比较郁闷的是总会被一些很简单的细节卡住很久. 首先当然是用C#修改xaml界面这个难点了,Bing搜了好久都没找到相关信息,最后还是老司机伟神指点的我.对于g ...

  4. Windows 10 UWP开发:如何去掉ListView默认的选中效果

    原文:Windows 10 UWP开发:如何去掉ListView默认的选中效果 开发UWP的时候,很多人会碰到一个问题,就是ListView在被数据绑定之后经常有个默认选中的效果,就像这样: 而且它不 ...

  5. 领域驱动和MVVM应用于UWP开发的一些思考

    领域驱动和MVVM应用于UWP开发的一些思考 0x00 起因 有段时间没写博客了,其实最近本来是根据梳理的MSDN上的资料(UWP开发目录整理)有条不紊的进行UWP学习的.学习中有了心得体会或遇到了问 ...

  6. UWP开发必备:常用数据列表控件汇总比较

    今天是想通过实例将UWP开发常用的数据列表做汇总比较,作为以后项目开发参考.UWP开发必备知识点总结请参照[UWP开发必备以及常用知识点总结]. 本次主要讨论以下控件: GridView:用于显示数据 ...

  7. Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App

    安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...

  8. UWP开发之控件:用WebView做聊天框

    目录 说明 WebView存在的价值 使用WebView的几个重要技巧 使用WebView做的聊天框 说明 大家都知道,无论是之前的Winform.WPF还是现在的IOS.Android开发中,都存在 ...

  9. Win10 UWP 开发系列:使用SQLite

    在App开发过程中,肯定需要有一些数据要存储在本地,简单的配置可以序列化后存成文件,比如LocalSettings的方式,或保存在独立存储中.但如果数据多的话,还是需要本地数据库的支持.在UWP开发中 ...

随机推荐

  1. WP8_给图片、按钮设置自定义图片

    工程目录下新建文件夹Images,将图片文件复制到Images文件夹里,本文以image1为例 1).在xaml里加背景图片 image图片: <Stretch="Fill" ...

  2. php xml 互相转换

    正好昨天才做过类似的需求……几行代码就可以搞定. 如果你使用 curl 获取的 xml data$xml = simplexml_load_string($data);$data['tk'] = js ...

  3. 实例分析ELF文件动态链接

    参考文献: <ELF V1.2> <程序员的自我修养---链接.装载与库>第6章 可执行文件的装载与进程 第7章 动态链接 <Linux GOT与PLT> 开发平台 ...

  4. javascript oo实现(转)

    javascript oo实现 By purplebamboo 7月 13 2014 更新日期:8月 21 2014 文章目录 1. 原始时代最简单的oo实现 2. 石器时代的oo实现 3. 工业时代 ...

  5. 基于jQuery打造的选项卡向上弹出jquery焦点图切换特效

    基于jQuery打造的选项卡向上弹出jquery焦点图切换特效 鼠标经过标题栏,会出现层特效向上滑动,并且在同时进行幻灯片切换,效果十分不错. 有兴趣的童鞋可以下载看看,在IE6方面兼容性也不错,只有 ...

  6. ubuntu下svn使用指南

    ubuntu下安装subversion客户端: sudo apt-get install subversion subversion-tools 详细请看 http://www.subversion. ...

  7. ASP.NET MVC5学习笔记之Controller同步执行架构分析

    在开始之前,声明一下,由于ASP.NET MVC5正式发布了,后面的分析将基于ASP.NET MVC5最新的源代码.在前面的内容我们分析了怎样根据路由信息来确定Controller的类型,并最终生成C ...

  8. 压力测试之TCPP

    1.下载源码 tpcc-mysql-src.tgz 2.解压 tpcc-mysql-src.tgz 3.安装 [root@DBMysql mysql]# cd /home/mysql/tpcc-mys ...

  9. Keil的使用方法 - 常用功能(二)

    Ⅰ.概述 上一篇文章是总结关于Keil使用方法-常用功能(一),关于(文件和编译)工具栏每一个按钮的功能描述和快捷键的使用. 我将每一篇Keil使用方法的文章都汇总在一起,回顾前面的总结请点击下面的链 ...

  10. django-url调度器-高级篇

    我们在中级篇中学会了如何进行反向解析,但是有这样一个问题,在为 url 命名的时候,名字不能重复,否则会导致各种各样的问题.在 url 还少的时候保证不重名还是比较简单的,但是 url 多起来以后就比 ...