win10 uwp 如何使用DataTemplate
这是数据模板,一般用在数组的绑定,显示数组中的元素。
假如我们有一个列表,列表里是书,包括书名、作者、还有出版,那么我们只有源信息,如何把它显示到我们的ListView,就需要DataTemplate。
使用很简单,我们可以定义在资源,也可以定义在ItemTemplate。
数据模板有绑定的问题。
我们使用Binding
和WPF其实没有多少不同,在Mode只有OneWay
,OneTime
,TwoWay
。我们使用的x:bind
在DataTemplate才和原来有一些不同。
我们使用x:bind
需要我们对我们数据的类型,这个在前没有,我开始不知,弄了好久,最后才知道,还有一个,UWP默认是OneTime,也就是绑定只有一次。
转换
有时候我们绑定的类型和显示不同,例如我们绑定了一个bool?
但是我们在 ViewModel 的类型是 bool,那么我们就需要用转换器。转换器就是继承 IValueConverter 的一个类。
UWP的 Convert 和 WPF 差不多。
数据转换一个简单方法是另外在 ViewModel 写一个属性,这个属性用于转换变量,然后在前台绑定,但是这样做不好,于是我们比较好的一个做法是做转换器,转换器是一个类,我们需要实现它才能使用,在我们常用的做法是把它写staticResource
首先是创建一个类,这个类继承IValueConverter,于是就有两个方法,我们要实现两个方法,一个是从数据源转换到 xaml ,一个是反过来。
public object Convert(object value, Type targetType,
object parameter,
string language);
public object ConvertBack(object value,
Type targetType,
object parameter, string language);
一般我们实现第一个就好,最简单的实现是直接转换。假如我们是需要把bool?
转bool,那么一个简单方法是:
public object Convert(object value, Type targetType,
object parameter,
string language)
{
if (value is bool?)
{
bool? temp = value as bool?;
if (temp == true)
{
return true;
}
return false;
}
return false;
}
在我的变大数字颜色按钮 代码在 https://github.com/lindexi/UWP/tree/master/uwp/control/RountGradualFigure 有用到转换,是把数字转颜色
我们要使用写的转换器,就需要在 xaml 写静态资源,我们也可以把他放在 viewModel,但是我们先说下放在 xaml 的。
在资源,如果是 Page 的 xaml,那么就写在Page.Resources
,如果只是这个转换器用在一个Grid,就写在Grid,我先用Page做例子。当然写为 FrameworkElement.Resources
就几乎在所有控件都可以使用。
<Page.Resources>
</Page.Resources>
我的转换器名称是:ConvertBooleanNull
假如我们放在 Model 里,命名空间是 项目.Model
,我们需要先在 xmlns 写xmlns:view="using:项目.Model"
,view 就是一个变量,这个可以改为你需要的。于是在需要使用的地方就可以使用 view 表示所在空间。
然后在静态资源使用下面代码<view:ConvertBooleanNull x:Key="ConvertBooleanNull"> </view:ConvertBooleanNull>
所有的代码请看下面
<Page.Resources>
<view:ConvertBooleanNull x:Key="ConvertBooleanNull"> </view:ConvertBooleanNull>
</Page.Resources>
在需要使用的控件,假如我们控件绑定是x:bind
,那么在Converter需要Converter={StaticResource ConvertBooleanNull}
假如我们控件绑定的是 ViewModel 的 JiuYouImageShack,需要进行转换,就可以写
<TextBox Text="{x:Bind View.JiuYouImageShack,Mode=OneWay,Converter={StaticResource ConvertBooleanNull}}"></TextBox>
需要知道,x:bind
默认是 OneTime 而 Binding
默认是 OneWay
参见:http://www.cnblogs.com/horan/archive/2012/02/27/2368262.html
[UWP]了解IValueConverter - dino.c - 博客园
绑定Event到Command
如果希望绑定事件,可以使用 下面代码
<ListView>
<Interactivity:Interaction.Behaviors>
<Core:EventTriggerBehavior EventName="SelectionChanged">
<Core:InvokeCommandAction Command="{Binding ShowDialog}" CommandParameter="{Binding ElementName=lv,Path=SelectedItem,Converter={StaticResource converter}}"/>
</Core:EventTriggerBehavior>
</Interactivity:Interaction.Behaviors>
</ListView>
绑定 ObservableCollection
如果绑定的 ItemSource 是一般的 List ,那么在 List 内容改变无法看到,界面修改
需要修改 List 内容,修改页面,添加一个新的 item 可以在页面添加一个 项,不是在初始的时候进行修改,可以使用方法:
在修改之后 使用 listView.Itemsource=list 的方法,重新给 Itemsource ,这是不推荐的,因为之后可能在代码写很多添加或移除,于是都需要写这个。
绑定的 List 改 ObservableCollection ,这样就可以在绑定内容修改时修改 界面。
第二个是推荐的,在使用 列表,经常使用的是 ObservableCollection ,注意,他是一个泛型,必须添加类型。
但是有时候可能关心他是如何做的,关心的原因:没有实现 AddRange,也就是 ObservableCollection 对一次添加多个项比较难,需要一个一个来。
对于定义控件,可能也需要,如何绑定一个 List 可以知道已经修改。
其实 ObservableCollection 继承 INotifyCollectionChanged ,于是可以获得列表修改,一旦自己定义继承 INotifyCollectionChanged 列表,可以做到和 ObservableCollection 差不多的样子。
先把东西分来说:一个是如何定义一个和 ObservableCollection 差不多,可以绑定界面,修改就自动让界面修改。一个是如何定义控件,可以获得列表改变。
先说第一个,其中只需要定义的列表 INotifyCollectionChanged 就可以让界面跟着修改,如果自己写的没有修改,那么是自己写错了,看起来 INotifyCollectionChanged 实现不是很简单。
第二个,可以使用依赖属性,在获得值判断 e.NewValue 是 INotifyCollectionChanged ,获得 CollectionChanged 的添加新项就可以。
DataTemplate 绑定 ViewModel
假如有一个 ViewModel 他有一个列表和字段
public List<string> Foo { set; get; } = new List<string>() { "1" };
public string Name { get; set; } = "lindex";
那么在页面写一个列表
<Grid x:Name="Grid">
<ListView ItemsSource="{Binding Foo}">
<ListView.ItemTemplate>
<DataTemplate >
<TextBlock Text="{Binding}"></TextBlock>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
可以看到页面显示一个元素,但是如何想让 TextBlock 绑定 Name 怎么做?
因为 Grid 的数据绑定 ViewModel,所以在 WPF 可以使用 Binding RelativeSource={RelativeSource AncestorType={x:Type Grid}
的写法绑定到指定的元素,所以获得数据,但是 UWP 不能这样写,可以使用下面的代码
<ListView ItemsSource="{Binding Foo}">
<ListView.ItemTemplate>
<DataTemplate >
<TextBlock Text="{Binding ElementName=Grid,Path=DataContext.Name}"></TextBlock>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
这样就可以绑定 ViewModel ,所以就可以使用属性
https://stackoverflow.com/a/47957417/6116637
我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新
如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。
win10 uwp 如何使用DataTemplate的更多相关文章
- win10 uwp 列表模板选择器
本文主要讲ListView等列表可以根据内容不同,使用不同模板的列表模板选择器,DataTemplateSelector. 如果在 UWP 需要定义某些列的显示和其他列不同,或者某些行的显示和其他行不 ...
- win10 uwp MVVM 轻量框架
如果在开发过程,遇到多个页面之间,需要传输信息,那么可能遇到设计的问题.如果因为一个页面内包含多个子页面和多个子页面之间的通信问题找不到一个好的解决方法,那么请看本文.如果因为ViewModel代码越 ...
- win10 uwp 毛玻璃
毛玻璃在UWP很简单,不会和WPF那样伤性能. 本文告诉大家,如何在 UWP 使用 win2d 做毛玻璃. 毛玻璃可以使用 win2D 方法,也可以使用 Compositor . 使用 win2d 得 ...
- win10 uwp 商业游戏 1.2.1
上一个游戏已经告诉大家如何写多个游戏,现在继续写这个无聊的游戏 希望大家在看这篇文章之前先看win10 uwp 商业游戏,在这个文章告诉了大家如何创建游戏. 修改数值 可以从上一篇的博客的游戏看到升级 ...
- win10 uwp 商业游戏
本文告诉大家去做一个商业游戏,游戏很简单,几乎没有什么技术 游戏的开始,需要添加框架库,于是引用我自己写的库. 首先是创建一个启动页面,这个页面是显示启动的. 在显示启动的时候,是需要加载游戏需要使用 ...
- win10 uwp 手把手教你使用 asp dotnet core 做 cs 程序
本文是一个非常简单的博客,让大家知道如何使用 asp dot net core 做后台,使用 UWP 或 WPF 等做前台. 本文因为没有什么业务,也不想做管理系统,所以看到起来是很简单. Visua ...
- win10 uwp 商业游戏 1.1.5
本文是在win10 uwp 商业游戏 基础上继续开发,添加一些无聊的游戏 因为在发布几个月,下载量很少,小伙伴说游戏就玩不到几分钟就不想玩,于是我就想加入其他游戏 下面我来告诉大家如何在游戏中添加多个 ...
- Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App
安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...
- Win10 UWP开发系列:实现Master/Detail布局
在开发XX新闻的过程中,UI部分使用了Master/Detail(大纲/细节)布局样式.Win10系统中的邮件App就是这种样式,左侧一个列表,右侧是详情页面.关于这种 样式的说明可参看MSDN文档: ...
随机推荐
- 【JZOJ1611】Dining
题目描述 农夫JOHN为牛们做了很好的食品,但是牛吃饭很挑食.每一头牛只喜欢吃一些食品和饮料而别的一概不吃.虽然他不一定能把所有牛喂饱,他还是想让尽可能多的牛吃到他们喜欢的食品和饮料. 农夫JOHN做 ...
- 【Mysql的那些事】数据库之ORM操作
1:ORM的基础操作(必会) <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(* ...
- 预警| Confluence 高危漏洞被大规模利用,阿里云WAF接入即可防护,支持免费应急服务
2019年4月4日,阿里云安全应急响应中心监测到Confluence 官方发布安全更新指出,Widget Connector 存在服务端模板注入漏洞,攻击者能利用此漏洞实现目录穿越遍历甚至远程命令执行 ...
- Nuxt.js打造旅游网站第2篇_首页开发
页面效果: 1.初始化默认布局 nuxtjs提供了一个公共布局组件layouts/default.vue,该布局组件默认作用于所有页面,所以我们可以在这里加上一些公共样式,在下一小结中还会导入公共组件 ...
- UVa 825【简单dp,递推】
UVa 825 题意:给定一个网格图(街道图),其中有一些交叉路口点不能走.问从西北角走到东南角最短走法有多少种.(好像没看到给数据范围...) 简单的递推吧,当然也就是最简单的动归了.显然最短路长度 ...
- Java练习 SDUT-1188_各位数字之和排序
C语言实验--各位数字之和排序 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给定n个正整数,根据各位数字之和从小到大 ...
- ROS 用 roboware实现节点信息发送和接收
在ros下实现节点编程,实现一个节点发送消息,另一个节点接收.实现方式有多种,可以直接在命令窗口创建工作空间包以及节点,用catkin_make进行编译,添加.bash路径,然后执行rosrun p ...
- 洛谷P1060 开心的金明
//01背包 价值等于重要度乘体积 #include<bits/stdc++.h> using namespace std; ; ; int n,m,v[maxn],w[maxn],f[m ...
- HZOJ 斐波那契(fibonacci)
先说一个规律: 如图将每个月出生的兔子的编号写出来,可以发现一只兔子在哪一列他的父亲就是谁. 每列的首项可以通过菲波那契求得. 然后你就可以像我一样通过这个规律打表每个点的父亲,预处理出倍增数组,倍增 ...
- NSOperation 详解
原文地址:http://nshipster.com/nsoperation/ 大家都知道的秘密是一个应用程序,瞬间响应卸载计算在后台异步完成.因此,现代的Objective-C开发者有两种选择:大中央 ...