接着上一篇来侃。

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

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

  所以,相应的我们就引入两个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. markdown语法学习源码

    __注: 结合markdown官方文档 其中大部分例子和说明文字都摘自官方文档__官方链接:[Markdown: Basics (快速入门)](http://wowubuntu.com/markdow ...

  2. LiveView 0.8 RC1 could boot evidence files acquired from Win10 64bit

    The latest Windows 10 will be more and more popular in the very near future. Now let's take a look i ...

  3. RequireJS首次加载偶尔失败

    现象:第一次加载JS文件,首次加载偶尔失败: 原因:require(['jquery', 'operamasks', 'zTree', 'jQueryCookie'],中前后引用同步加载: 解决方式: ...

  4. box2d 遍历世界中 body 的方法

    大家都知道,循环遍历有很多方法,在box2d中大家普遍使用while和for循环来遍历世界,那什么时候使用for,什么时候使用while呢? 当循环中不设计body删除的时候,使用for循环,即: C ...

  5. 较好的IOS新闻客户端应用源码

    兼容性较好的新闻客户端应用源码,这个是一款国外新闻客户端源码,并且这款应用兼容性非常好的,可以很好地兼容iPhone和iPad的使用,而且应用的功能很多,新闻列表,上啦下拉刷新效果,评论列表,在线评论 ...

  6. ASP.NET MVC SignalR

    本系列博文主要介绍了 ASP.NET SignalR 的相关知识与开发,参考来源为<ASP.NET SignalR 编程实践>. 目录: SignalR背景 SignalR概述

  7. 前端开发之-------------合理利用CSS的权重----------------

    什么是CSS的权重?对于前端工程师来说,这是一个很基础的问题,如果前端工程师没有深刻理解这个概念,则很难写出高质量的CSS代码. 那么到底什么是CSS的权重呢?我们又怎么来进行判定CSS的权重呢? 讨 ...

  8. Silverlight 读取配置文件

    1.ExtranetLink.xml <?xml version="1.0" encoding="utf-8" ?> <menus> & ...

  9. sed命令实战

    删除所有的空行,并在每行后面增加一个空行 sed '/^$/d;G' /etc/fstab 将每一行前导的“空白字符”(空格,制表符)删除 sed 's/^[\t ]*//' file 将文本中的 a ...

  10. Ubuntu开发环境搭建

    linux开发不得不用虚拟机,为了节省系统资源.决定采用Ubuntu Server逐步搭建出具有图形界面的开发环境. ubuntu server 安装英文版 安装选择选generic,不要LVM选项. ...