win10 uwp DataContext
本文告诉大家DataContext的多种绑法。
适合于WPF的绑定和UWP的绑定。
我告诉大家很多个方法,所有的方法都有自己的优点和缺点,可以依靠自己喜欢的用法使用。当然,可以在新手面前秀下,一个页面一个绑定方法。
开始是从最简单的来说起。
资源绑定
最简单的绑定是写在资源。
<Page.Resources>
<viewModel:ViewModel x:Key="ViewModel"></viewModel:ViewModel>
</Page.Resources>
这时就可以在Grid绑定,当然缺点就是 后台代码无法直接使用,需要经过转换才可以使用。
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
DataContext="{StaticResource ViewModel}">
</Grid>
因为很多WPF程序都是把界面放在 Window 而不是放在页,所以为了在 UWP 和WPF使用的都是相同。可以用 FrameworkElement 代替 Page 。因为所有控件几乎都继承于 FrameworkElement 于是在页面任何地方都可以放这句话,不需要多余修改。所以刚才的 Page.Resources 就可以修改为 FrameworkElement.Resources
可是这个方法有个缺点,无法在页面 Page 元素上使用 DataContext 绑定,只能在 资源后面的 Grid 使用。因为资源是有顺序,Page 在资源之前,于是 Page 就无法绑定。在WPF的也一样。提示的错误参见下图。
如果只有一个页面,而且使用的地方也是在 页面的内容,那么建议使用这个方法。

如果需要在 Page 的元素也绑定到 ViewModel ,那么可以参见下面的方法。
app 资源绑定
另一个方法是把他写到 app ,代码就是
<Application.Resources>
<viewModel:ViewModel x:Key="ViewModel"></viewModel:ViewModel>
</Application.Resources>
这样在程序任何地方都可以使用

我的想法,如果是 ViewModel ,那么写在这里,对于 MVVM 的 ViewModel ,MainPage 对应的 ViewModel 建议写在这里。
如果写在这,代码使用 (ViewModel) App.Current.Resources["ViewModel"] 就可以获得,也就是在任意的代码都可以使用这个方法获得。参见:win10 uwp 后台获取资源
这个方法的优点:
在程序运行时都可以得到 ViewModel ,这是这方法适合的地方。
当然缺点是,如果你写了很多个 ViewModel 在资源,在程序运行都会占内存,也不会释放,所以一般建议只写ViewModel ,不要写多个。
DataContext 新建资源
如果对于一个 ViewModel 只有一个页面使用,那么可以不需要写在 App ,因为这样会让其它的页面都可以访问
遇到上面的需要,只有一个页面需要 ViewModel ,可以直接写
<Page.DataContext>
<vm:ViewModel></vm:ViewModel>
</Page.DataContext>
这个方法可以让ViewModel和页面都在一个时间,也就是关闭了页面,也就自动关了 ViewModel ,说了这么多,好像还没说如何在代码使用 viewModel 。上面的所有方法在代码使用 ViewModel 都相同。
后台代码获得资源
先定义属性 ViewModel ,然后在 构造写从 DataContext 转换。记得写构造函数的最后,在 InitializeComponent 的后面。
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
ViewModel = (ViewModel) DataContext; //这是 cast 方法,直接转换,不要使用 as 的方法。
}
private ViewModel ViewModel { set; get; }
}
为何需要把 ViewModel 转换写在最后,我就不继续解释。
关于为何使用 cast 而不是 as ,因为已经确定了现在使用的类型就是 ViewModel ,我也需要使用的是 ViewModel 不是其他,如果有人改了其它的类型,我必须报错,于是就使用 cast ,如果使用了 Cast 那么看日志比较容易看到是那里写错。
代码定义资源
代码绑定
除了在 xaml 定义DataContext,一个常用方法是在 代码定义
public MainPage()
{
ViewModel = new ViewModel();
this.InitializeComponent();
DataContext = ViewModel;
}
private ViewModel ViewModel
{
set; get;
}
这个方法也是推荐的,可以在代码定义,但是这样在 xaml 写 binding 就不会有提示。
如果只在代码写新建 ViewModel ,不定义 DataContext ,把他写在 xaml ,那么就可以获得提示。
代码定义,xaml绑定
这里的 提示 指的是,在 xaml 输入的时候,写一个变量不需要完全自己写。和后台代码一样,会提示这个变量,自动给你选。没有提示容易写错代码,而且变量改名了,xaml不会随着改。
public MainPage()
{
ViewModel = new ViewModel();
this.InitializeComponent();
}
private ViewModel ViewModel
{
set; get;
}
DataContext="{Binding RelativeSource={RelativeSource Self},Path=ViewModel}"
这句代码是写在 Page ,如果写在其他的 Grid 得到就不会有 ViewModel 。
大概就是所有的可以定义 DataContext 的方法。
如果你还有新的方法,欢迎讨论。

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。
win10 uwp DataContext的更多相关文章
- win10 uwp 商业游戏 1.2.1
上一个游戏已经告诉大家如何写多个游戏,现在继续写这个无聊的游戏 希望大家在看这篇文章之前先看win10 uwp 商业游戏,在这个文章告诉了大家如何创建游戏. 修改数值 可以从上一篇的博客的游戏看到升级 ...
- win10 uwp 手把手教你使用 asp dotnet core 做 cs 程序
本文是一个非常简单的博客,让大家知道如何使用 asp dot net core 做后台,使用 UWP 或 WPF 等做前台. 本文因为没有什么业务,也不想做管理系统,所以看到起来是很简单. Visua ...
- win10 uwp 商业游戏 1.1.5
本文是在win10 uwp 商业游戏 基础上继续开发,添加一些无聊的游戏 因为在发布几个月,下载量很少,小伙伴说游戏就玩不到几分钟就不想玩,于是我就想加入其他游戏 下面我来告诉大家如何在游戏中添加多个 ...
- win10 uwp 如何使用DataTemplate
这是数据模板,一般用在数组的绑定,显示数组中的元素. 假如我们有一个列表,列表里是书,包括书名.作者.还有出版,那么我们只有源信息,如何把它显示到我们的ListView,就需要DataTemplate ...
- Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App
安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...
- Win10 UWP开发系列:实现Master/Detail布局
在开发XX新闻的过程中,UI部分使用了Master/Detail(大纲/细节)布局样式.Win10系统中的邮件App就是这种样式,左侧一个列表,右侧是详情页面.关于这种 样式的说明可参看MSDN文档: ...
- Win10 UWP开发实现Bing翻译
微软在WP上的发展从原来的Win7到Win8,Win8.1,到现在的Win10 UWP,什么是UWP,UWP即Windows 10 中的Universal Windows Platform简称.即Wi ...
- Win10/UWP开发—使用Cortana语音与App后台Service交互
上篇文章中我们介绍了使用Cortana调用前台App,不熟悉的移步到:Win10/UWP开发—使用Cortana语音指令与App的前台交互,这篇我们讲讲如何使用Cortana调用App的后台任务,相比 ...
- 【Win10 UWP】后台任务与动态磁贴
动态磁贴(Live Tile)是WP系统的大亮点之一,一直以来受到广大用户的喜爱.这一讲主要研究如何在UWP应用里通过后台任务添加和使用动态磁贴功能. 从WP7到Win8,再到Win10 UWP,磁贴 ...
随机推荐
- 团队作业4——第一次项目冲刺(Alpha版本)1st day
一.Daily Scrum Meeting照片 二.燃尽图 三.项目进展 1.界面 主界面以及游戏界面大体上完成了 界面内的功能正在写 2.登陆方面 QQ授权还未申请 申请完在登陆界面完成后实现用QQ ...
- 201521123060《Java程序设计》第2周学习总结
1. 本周学习总结 a.进一步熟悉了Eclipse的使用和java程序的编写: b.学习了java数据的基本类型:整数类型,浮点类型等: c.学习了算数运算符,赋值运算符,位运算符,关系运算符,逻辑运 ...
- 学号:201521123116 《java程序设计》第九周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己 ...
- Akka(25): Stream:对接外部系统-Integration
在现实应用中akka-stream往往需要集成其它的外部系统形成完整的应用.这些外部系统可能是akka系列系统或者其它类型的系统.所以,akka-stream必须提供一些函数和方法来实现与各种不同类型 ...
- 转 Java输入输出流详解(非常详尽)
转 http://blog.csdn.net/zsw12013/article/details/6534619 通过数据流.序列化和文件系统提供系统输入和输出. Java把这些不同来源和目标的数据都 ...
- Activiti-03-query api
Query API 有两种方式从引擎中查询数据, 查询 API 和本地查询. API方式: List<Task> tasks = taskService.createTaskQuery ...
- JMeter基础之—录制脚本
Jmeter 是一个非常流行的性能测试工具,虽然与LoadRunner相比有很多不足,比如:它结果分析能力没有LoadRunner详细:很它的优点也有很多: l 开源,他是一款开源的免费软 ...
- apriori关联规则
挖掘数据集:贩物篮数据 频繁模式:频繁地出现在数据集中的模式,例如项集,子结构,子序列等 挖掘目标:频繁模式,频繁项集,关联规则等 关联规则:牛奶=>鸡蛋[支持度=2%,置信度=60%] ...
- GCD之异步同步体会
前面的博文也有写到同步异步,可能是看他人的博文,自己没有实验,感觉理解不深,所以就敲了些代码比较一下串行.并行分别对应的同步.异步. 1.首先创建串行.并行线程队列 1 2 dispatch_queu ...
- jsp base路径
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...