首页 > 代码库 > 为Page添加INotifyPropertyChanged功能
为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 = http://www.mamicode.com/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 = http://www.mamicode.com/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 = http://www.mamicode.com/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功能
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。