码迷,mamicode.com
首页 > 其他好文 > 详细

为Page添加INotifyPropertyChanged功能

时间:2016-10-21 20:04:25      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:isp   display   prism   类型   ane   方法   return   inotify   技术分享   

在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>();

    }
}
View Code

标准实现接口的代码: 本次没使用.

技术分享
  /// <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));
        }
    }
View Code

 

为Page添加INotifyPropertyChanged功能

标签:isp   display   prism   类型   ane   方法   return   inotify   技术分享   

原文地址:http://www.cnblogs.com/NianJiTao/p/5985650.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!