title author date CreateTime categories
win10 uwp DataContext
lindexi
2018-08-10 19:16:53 +0800
2018-2-13 17:23:3 +0800
Win10 UWP

本文告诉大家DataContext的多种绑法。
适合于WPF的绑定和UWP的绑定。
我告诉大家很多个方法,所有的方法都有自己的优点和缺点,可以依靠自己喜欢的用法使用。当然,可以在新手面前秀下,一个页面一个绑定方法。

开始是从最简单的来说起。

需要知道的

用户控件

如果有使用用户控件,那么容易被这个坑啦,如果发现自己的绑定失败了,那么需要看一下是不是因为用户控件绑定和其他控件不相同。

先创建一个用户控件 LuenqxuhkRrjbzcf ,这是一个空白的用户控件,只需要修改背景色

    <Grid Background="Coral">
<TextBlock Text="lindexi.oschina.io" Margin="135,103,-135,-103"></TextBlock>
</Grid>

然后在首页添加这个控件

        <local:LuenqxuhkRrjbzcf ></local:LuenqxuhkRrjbzcf>

这时可以看到控件显示,然后把他的 Visbilibity 绑定到 ViewModel 的属性,这时的属性的值是 Collapsed ,所以添加到首页的控件是看不到的

    public class ViewModel
{
public Visibility AuynPsfqq { get; set; } = Visibility.Collapsed;
}
        <local:LuenqxuhkRrjbzcf Visibility="{Binding AuynPsfqq}"></local:LuenqxuhkRrjbzcf>

这时可以发现,运行看不到控件,但是如果在用户控件设置了 DataContex 那么绑定就找不到源

        private void LuenqxuhkRrjbzcf_Loaded(object sender, RoutedEventArgs e)
{
DataContext = this;
}

接下来添加两个按钮在首页,一个是设置用户控件的 DataContext ,一个删除,这时可以看到界面出现变化

<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="203*"/>
<RowDefinition Height="47*"/>
</Grid.RowDefinitions>
<local:LuenqxuhkRrjbzcf x:Name="IonMjheadyz" Visibility="{Binding AuynPsfqq}" ></local:LuenqxuhkRrjbzcf>
<Grid Grid.Row="1">
<Button Margin="10,0,0,0" Content="设置用户控件" Click="NefjxuqelLriklu_OnClick"></Button>
<Button Content="删除" HorizontalAlignment="Right" Click="SfpgucmgtYserkpend_OnClick" Margin="0,27,86,88"></Button>
</Grid>
</Grid>
        private void NefjxuqelLriklu_OnClick(object sender, RoutedEventArgs e)
{
IonMjheadyz.DataContext = this;
} private void SfpgucmgtYserkpend_OnClick(object sender, RoutedEventArgs e)
{
IonMjheadyz.ClearValue(DataContextProperty);
}

因为 DataContext 是依赖属性,如果设置依赖属性,那么就是使用自己的值,如果没有就使用上一级的值。绑定的数据就从 DataContext 拿,所以给用户控件设置 DataContext 就会让界面的绑定找不到值,所以绑定失败。

资源绑定

page 资源绑定

最简单的绑定是写在资源。

    <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 的方法。

如果你还有新的方法,欢迎讨论。

2018-8-10-win10-uwp-DataContext-的更多相关文章

  1. win10 uwp DataContext

    本文告诉大家DataContext的多种绑法. 适合于WPF的绑定和UWP的绑定. 我告诉大家很多个方法,所有的方法都有自己的优点和缺点,可以依靠自己喜欢的用法使用.当然,可以在新手面前秀下,一个页面 ...

  2. win10 uwp 商业游戏 1.2.1

    上一个游戏已经告诉大家如何写多个游戏,现在继续写这个无聊的游戏 希望大家在看这篇文章之前先看win10 uwp 商业游戏,在这个文章告诉了大家如何创建游戏. 修改数值 可以从上一篇的博客的游戏看到升级 ...

  3. win10 uwp 手把手教你使用 asp dotnet core 做 cs 程序

    本文是一个非常简单的博客,让大家知道如何使用 asp dot net core 做后台,使用 UWP 或 WPF 等做前台. 本文因为没有什么业务,也不想做管理系统,所以看到起来是很简单. Visua ...

  4. win10 uwp 使用 Microsoft.Graph 发送邮件

    在 2018 年 10 月 13 号参加了 张队长 的 Office 365 训练营 学习如何开发 Office 365 插件和 OAuth 2.0 开发,于是我就使用 UWP 尝试使用 Micros ...

  5. win10 uwp 商业游戏 1.1.5

    本文是在win10 uwp 商业游戏 基础上继续开发,添加一些无聊的游戏 因为在发布几个月,下载量很少,小伙伴说游戏就玩不到几分钟就不想玩,于是我就想加入其他游戏 下面我来告诉大家如何在游戏中添加多个 ...

  6. Win10 UWP开发实现Bing翻译

    微软在WP上的发展从原来的Win7到Win8,Win8.1,到现在的Win10 UWP,什么是UWP,UWP即Windows 10 中的Universal Windows Platform简称.即Wi ...

  7. Win10/UWP开发—使用Cortana语音与App后台Service交互

    上篇文章中我们介绍了使用Cortana调用前台App,不熟悉的移步到:Win10/UWP开发—使用Cortana语音指令与App的前台交互,这篇我们讲讲如何使用Cortana调用App的后台任务,相比 ...

  8. Win10 UWP应用发布流程

    简介 Win10 UWP应用作为和Win8.1 UAP应用不同的一种新应用形式,其上传至Windows应用商店的流程也有了一些改变. 这篇博文记录了我们发布一款Win10 UWP应用的基本流程,希望为 ...

  9. win10 uwp 列表模板选择器

    本文主要讲ListView等列表可以根据内容不同,使用不同模板的列表模板选择器,DataTemplateSelector. 如果在 UWP 需要定义某些列的显示和其他列不同,或者某些行的显示和其他行不 ...

  10. win10 uwp 获得元素绝对坐标

    有时候需要获得一个元素,相对窗口的坐标,在修改他的位置可以使用. 那么 UWP 如何获得元素坐标? 我提供了一个方法,可以获得元素的坐标. 首先需要获得元素,如果没有获得元素,那么如何得到他的坐标? ...

随机推荐

  1. casperjs-options

    The Casper class The easiest way to get a casper instance is to use the module's create() method: 最简 ...

  2. 【知识强化】第四章 网络层 4.3 IP

    这节课我们来学习一下IP数据报的格式.那之所以把路由算法这一小节跳过呢,就是因为我们之后会要讲到路由的选择协议.那在路由选择协议这一块讲路由算法,我觉得是比较合适的.那我们先来看一下这节课要讲的知识. ...

  3. Nginx的应用之安装配置

    一.Nginx简述 Nginx是一个开源且高性能.可靠的Http Web服务.代理服务. 开源: 直接获取源代码 高性能: 支持海量并发 可靠: 服务稳定 我们为什么选择 Nginx服务 Nginx非 ...

  4. 力扣——single number (只出现一次的数字) python实现

    题目描述: 中文: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 英 ...

  5. Java缓冲流的优点和原理

    不带缓冲的流的工作原理: 它读取到一个字节/字符,就向用户指定的路径写出去,读一个写一个,所以就慢了. 带缓冲的流的工作原理: 读取到一个字节/字符,先不输出,等凑足了缓冲的最大容量后一次性写出去,从 ...

  6. 理解Python中的继承规则和继承顺序

    先来看一段代码: class First(object): def __init__(self): print ("first") class Second(object): de ...

  7. ubuntu Linux下chromium无法使用flash解决方法

    Chromium作为谷歌的开源浏览器将不再支持Netscape浏览器插件API,Adobe公司的Flash将无法正常工作了.然而用户可以使用Pepper Flash Player,这是谷歌浏览器上一款 ...

  8. Hadoop 权限管理(转)

    如下图,hadoop访问控制分为两级,其中ServiceLevel Authorization为系统级,用于控制是否可以访问指定的服务,例如用户/组是否可以向集群提交Job,它是最基础的访问控制,优先 ...

  9. echarts 柱状图 X(Y)轴数据过多时,滑动以及内置缩放的问题

    前言:在开发中碰到的情况(菜鸟出门).           在使用echarts 图表的时候发现要展示的数据过多,但是系统留的展示框太小,造成数据都挤压在一块(不好看而且新感觉很不专业).       ...

  10. 尚学linux课程---12、vim操作命令2

    尚学linux课程---12.vim操作命令2 一.总结 一句话总结: 要看不同的视频,每个视频的关键点都不一样,不如之间的的视频就没讲到vim中set nu是什么意思 学了的内容一定要练,不然真的是 ...