为Page添加INotifyPropertyChanged功能
在Page页面里面, DataContext 更新后,前台数据要求会自动更新.
但前台的绑定如果用x:bind 语法. 它要求强类型.直接关联到DataContext上就不行了.
需要为Page 添加 INotifyPropertyChanged 接口实现.
页面如果很多的话. 为每个页面实现此接口,代码将有不少重复.
为了减少代码重复量而努力.
现在要在页面代码里面添加vm属性.这是强类型.所以可以让前台使用x:bind.
public Vm<设置PageViewModel> VM { get; } = new Vm<设置PageViewModel>();
vm泛型类定义如下: 这样当Data更新后,就会自动通知前台.
public class Vm<T> : ViewModelBase
{
private T _data; public T Data
{
get { return _data; }
set { SetProperty(ref _data, value); }
}
}
还要订阅事件更新,放在构造函数里面.这样当DataContext更新后.同时赋值给Data.
DataContextChanged += (s, e) => VM.Data = this.DataContext as 设置PageViewModel;
这样只需要在Page里面添加2行代码就可以实现属性自动更新了.
PageViewModel 类型是继承 ViewModelBase 的. 带属性更新通知功能.引用Prism类就有.
前台绑定如下: 需要指定Mode,不然就是OneTime.
Text="{x:Bind VM.Data.说明, Mode=OneWay}"
使用x:Bind 绑定可以直接绑定到事件,方法等等.自带属性参数事件.听说效率也比Binding 高.
如:
IsPaneOpen="{x:Bind VM.Data.Is左侧打开, Mode=TwoWay}"
ItemClick="{x:Bind VM.Data.HamburgerMenu_OnItemClick}"
整个页面内代码:
namespace 年纪涛.简介.Views
{
/// <summary>
/// 可用于自身或导航至 Frame 内部的空白页。
/// </summary>
public sealed partial class 设置Page : Page
{
public 设置Page()
{
this.InitializeComponent();
DataContextChanged += (s, e) => VM.Data = this.DataContext as 设置PageViewModel;
} public Vm<设置PageViewModel> VM { get; } = new Vm<设置PageViewModel>(); }
}
标准实现接口的代码: 本次没使用.
/// <summary>
/// 继承此page,可以带属性更新通知和vm更新通知功能.
/// </summary>
/// <typeparam name="T"></typeparam>
public class PageBase<T> : Page, INotifyPropertyChanged where T : class
{
public event PropertyChangedEventHandler PropertyChanged; public PageBase()
{
DataContextChanged += (s, e) => VM.Data = DataContext as T;
}
public Vm<T> VM { get; } = new Vm<T>(); protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
为Page添加INotifyPropertyChanged功能的更多相关文章
- 033医疗项目-模块三:药品供应商目录模块——供货商药品目录t添加查询功能----------Dao层和Service层和Action层和调试
什么叫做供货商药品目录t添加查询功能?就是说我们前面的博客里面不是说供货商登录后看到了自己供应的药品了么如下: 现在供货商想要往里面添加别的药品,那么这个药品的来源就是卫生局提供的那个Ypxx表(药品 ...
- 图像处理控件ImageGear for .NET教程如何为应用程序 添加DICOM功能(2)
在前面的一些关于图像处理控件ImageGear for .NET文章<图像处理控件ImageGear for .NET教程: 添加DICOM功能(1)>中讲解了如何对应用程序添加DICOM ...
- 雷林鹏分享:jQuery EasyUI 数据网格 - 添加查询功能
jQuery EasyUI 数据网格 - 添加查询功能 本实例演示如何从数据库得到数据,并将它们显示在数据网格(datagrid)中.然后演示如何根据用户输入的搜索关键词搜寻显示结果. 创建数据网格( ...
- 接入gitment为hexo添加评论功能
title: 接入gitment为hexo添加评论功能 toc: false date: 2018-04-16 10:59:56 categories: methods tags: hexo gitm ...
- 创建ASP.NET Core MVC应用程序(5)-添加查询功能 & 新字段
创建ASP.NET Core MVC应用程序(5)-添加查询功能 & 新字段 添加查询功能 本文将实现通过Name查询用户信息. 首先更新GetAll方法以启用查询: public async ...
- (三)开始在OJ上添加签到功能
在了解完OJ文件下的各个文件夹的主要作用后,我们开始往里面添加东西(其实只要知道各文件夹是干什么的后,添加东西也变得非常简单了) 一 在数据库中添加对应功能的字段. 我们这个学期才刚开数据库这门课,所 ...
- sharepoint 2010 如何给文档库或自定义列表添加评论功能
转:http://www.cfanz.cn/?c=article&a=read&id=40924 最近公司在知识库中,有一个需求,就是想要给文档添加评论功能,在sharepoint 2 ...
- 给destoon商城的列表中和首页添加购物车功能
如何给destoon商城的列表中和首页添加购物车功能? 目前加入购物车的功能只存在商城的详细页面里,有时候我们需要批量购买的时候,希望在列表页就能够使用这个加入购物车的功能. 修改步骤见下: 例如在商 ...
- Centos6.4 为用户添加sudo功能
sudo即super user do,以超级管理员的方式运行命令.使用时,只需在命令最前面加上sudo即可. 要为用户添加sudo功能,需要修改sudo的配置文件: vi /etc/sudoers ( ...
随机推荐
- [Swift] 疑难杂症
[Swift] 疑难杂症 1.class .... has no initializers --> class 的每一个元素都需要初始化,否则会报错,除了可空元素
- RTTI 运行时类型识别 及异常处理
RTTI 运行时类型识别 typeid ------ dynamic_cast dynamic_cast 注意事项: 1.只能应用于指针和引用之间的转化 2.要转换的类型中必须包含虚函数 3. ...
- oracle表结构和表内容差异比对
oracle表结构和表内容差异比对 oracle中有三种集合操作,他们会把左边和右边的select 结果集进行集合操作. union 并集 intersect 交集 minus 差集 假设有如下两张表 ...
- CURLcode curl_easy_setopt(原创)
中文翻译: curl_easy_setopt() libcurl 手册 curl_easy_setopt() 名称 curl_easy_setopt -curl的设置选项 概要 #include &l ...
- C#多线程实现方法
C#中实现线程应用开发的类都包含在了System.Threading命名空间中,比较常用的是Thread,ThreadPool类 Thread类构造函数作用是创建线程,有两个重载版本,一个带参数,一个 ...
- TCP、UDP协议间的区别(转)
一.TCP/IP协议是一个协议簇.里面包括很多协议的.UDP只是其中的一个.之所以命名为TCP/IP协议,因为TCP,IP协议是两个很重要的协议,就用他两命名了. TCP/IP协议集包括应用层,传输层 ...
- 控制input标签中只能输入数字以及小数点后两位
js 代码如下: /* 控制input标签中只能输入数字 和小数点后两位 */ function checkNum(obj) { //检查是否是非数字值 if (isNaN(obj.value)) { ...
- ngRoute插件
angular中可以使用插件,例如ngRoute插件就是用与路由控制. 首先要在模块中引入即可: var m1 = angular.module('myApp',['ngRoute']); 然后我们进 ...
- django admin后台提示没有static样式相关的文件
问题现象: 将 DEBUG = TEMPLATE_DEBUG = False 设置为False后,访问admin的管理后台,没有样式了. 解决办法: vim settings.py 确保有下面的这两 ...
- 用数组取到当前栈内的ViewController 并根据下标取某个ViewController
NSArray *navArray = self.navigationController.viewControllers; TabsViewController *tabsVC = [[TabsVi ...