win10 uwp 依赖属性
本文告诉大家如何使用依赖属性,包括在 UWP 和 WPF 如何使用。
本文不会告诉大家依赖属性的好处,只是简单告诉大家如何使用
在 UWP 和 wpf ,如果需要创建自己的依赖属性,可以使用代码片,在 VisualStudio 可以使用 propdp输入两个 tab 就可以输入依赖属性。
本文最后提供修改的代码片,可以解决变量名修改出现的界面绑定不刷新。
UWP
什么时候可以获取继承的依赖属性
依赖属性一般是不在构造函数写获取继承的属性的值,因为一般这时拿到的值都是没有继承,请看下面的代码
创建一个用户控件 LuenqxuhkRrjbzcf ,在他的构造函数和加载完成事件添加获得 DataContext 的值
  构造: var t = DataContext;
          private void LuenqxuhkRrjbzcf_Loaded(object sender, RoutedEventArgs e)
        {
            var t = DataContext;
        }
然后把他加入到其他页面,这个页面设置了 DataContext ,但是运行在构造的断点可以看到拿到的值是空

但是可以在加载完成函数拿到

那么是在什么时候才可以拿到依赖属性的值?
依赖属性需要在加逻辑树才可以拿到值,所以在加入逻辑树之后,构造函数是类创建,所以这时不能拿依赖属性的值。
自定义可继承依赖属性
我找了很久,发现 uwp 不支持 FrameworkPropertyMetadata 所以无法自己定义可以继承的依赖属性
WPF
后台绑定 依赖属性
后台绑定 依赖属性可以使用 Binding
            Binding bind = new Binding("绑定路径,就是哪个属性")
            {
                Source = 绑定源,如果没有设置,可以使用 DataContext,
                Mode = BindingMode.OneWayToSource
            };
           一个继承依赖的类.SetBinding(xx.xProperty, bind);例如绑定 ViewModel 的 Padding 到 一个 G控件的 Padding, 可以使用下面代码
                Binding bind = new Binding("Padding")
            {
                Source = ViewModel,
                Mode = BindingMode.OneWayToSource
            };
            G.SetBinding(Border.PaddingProperty, bind);但我的问题是,绑定只能在包含 G 的类使用?
也就是在 MainPage 写了 G 这个 类,于是绑定只能写在 MainPage 类?
实际我用了一个类来测试
我把上面的绑定代码写到 ViewModel ,发现还是可以使用。
那么问题2,如果我的 ViewModel 的绑定属性是私有的,那么把绑定写在ViewModel 里,那么是否可以访问,可以看到,如果写在ViewModel 的Binding ,那么这个 Binding 是可以访问 ViewModel 的属性,虽然这个属性是私有的。但是实际绑定需要获取的不是在创建的时候拿到,所以这时是获取不到ViewModel 里的属性。
我尝试下面的代码,把 Padding 设置为 private ,然后在 ViewModel 里绑定到他,结果发现无法从绑定获得。
       public partial class MainWindow : Window
    {
        public MainWindow()
        {
            ViewModel = new ViewModel();
            InitializeComponent();
            DataContext = ViewModel;
            ViewModel.Board = G;
            //Binding bind = new Binding("Padding")
            //{
            //    Source = ViewModel,
            //    Mode = BindingMode.OneWayToSource
            //};
            //G.SetBinding(Border.PaddingProperty, bind);
            ViewModel.Click();
        }
        public ViewModel ViewModel { get; set; }
        private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
        {
            G.Padding = new Thickness(G.Padding.Left + 1, G.Padding.Top + 1, G.Padding.Right, G.Padding.Bottom);
            Console.WriteLine(ViewModel.Pad());
        }
    }
    public class ViewModel
    {
        public Thickness Pad()
        {
            return Padding;
        }
        private Thickness Padding { get; set; }
        public Border Board { get; set; }
        public void Click()
        {
            Binding bind = new Binding("Padding")
            {
                Source = this,
                Mode = BindingMode.OneWayToSource
            };
            Board.SetBinding(Border.PaddingProperty, bind);
        }
    }如果在绑定之前,设置 G 的 Padding 为一个值,那么在设置绑定之后,这个值就会被设置默认值。
如果在绑定之前,设置 G 的 Padding 为20 ,那么设置绑定之后, G 的 Padding = 0
如果需要保留这个值,可以使用临时变量。
绑定还有另一个问题,一个属性只能做一次绑定。
假如我有多个属性,把这多个属性绑定在 G 的 Padding ,那么只有最后的一个绑定可以使用,其他的绑定无法使用。
            public Thickness BoardPadding { get; set; }
       public void Click()
        {
            Binding bind = new Binding("Padding")
            {
                Source = this,
                Mode = BindingMode.OneWayToSource
            };
            BindingOperations.SetBinding(Board, Border.PaddingProperty, bind);
            bind = new Binding("BoardPadding")
            {
                Source = this,
                Mode = BindingMode.OneWayToSource
            };
            Board.SetBinding(Border.PaddingProperty, bind);
        }可以看到,这时 Padding 的值一直没有。
WPF 获得依赖属性值更新
如果需要获得 G 的 Padding 的值更改,WPF 获得依赖属性 值更改可以使用下面代码
                DependencyPropertyDescriptor.FromProperty(Border.PaddingProperty,typeof(Border)).AddValueChanged(Board,
                (s, e) =>
                {
                    Padding = Board.Padding;
                    BoardPadding = Board.Padding;
                });这个方法就是获得属性的值更改
但是这个方法会出现内存泄露,可以使用 RemoveValueChanged 清除,为了使用清除,需要写一个函数。
不需要担心清除一个不存在的委托,一般在使用 AddValueChanged 之前都使用 RemoveValueChanged 清除
参见:https://stackoverflow.com/questions/4764916/listen-to-changes-of-dependency-property
初始化出现默认值类型与属性类型不同
定义的依赖属性是需要默认值类型和定义的一样,在一般的代码,可以使用隐式转换,但是在定义不可以使用。
例如使用类型是 double 实际给的是 int ,就会在运行出现ArgumentException
        public static readonly DependencyProperty FooProperty = DependencyProperty.Register(
            "Foo", typeof(double), typeof(MainWindow), new PropertyMetadata(2));
        public double Foo
        {
            get { return (double) GetValue(FooProperty); }
            set { SetValue(FooProperty, value); }
        }虽然定义double a=2;是对的,但是在这里定义的 2默认是错误的,需要写2d才是对的
修改属性名称
默认的代码片生成代码的属性名称是字符串,但是字符串有个缺点,如果修改了变量名,那么界面绑定就无法找到。
建议把字符串换为C# 6.0 带来的新特性
       public static readonly DependencyProperty FooProperty = DependencyProperty.Register(
            nameof(Foo), typeof(double), typeof(MainWindow), new PropertyMetadata(2d));
        public double Foo
        {
            get { return (double) GetValue(FooProperty); }
            set { SetValue(FooProperty, value); }
        }通过修改代码片就可以做到,如何修改请看 resharper 自定义代码片
下面就是修改后的代码
public static readonly $dependencyProperty$ $propertyName$Property = $dependencyProperty$.Register(
  nameof($propertyName$), typeof($propertyType$), typeof($containingType$), new PropertyMetadata(default($propertyType$)));
public $propertyType$ $propertyName$
{
  get { return ($propertyType$) GetValue($propertyName$Property); }
  set { SetValue($propertyName$Property, value); }可以直接粘贴进去Resharper的代码
或者导入我的设置,点击下载
如果想要使用的是 C# 7 的特性,可以修改代码片,或者点击下载导入
public static readonly $dependencyProperty$ $propertyName$Property = $dependencyProperty$.Register(
  nameof($propertyName$), typeof($propertyType$), typeof($containingType$), new PropertyMetadata(default($propertyType$)));
public $propertyType$ $propertyName$
{
  get => ($propertyType$) GetValue($propertyName$Property);
  set => SetValue($propertyName$Property, value);
}

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。
win10 uwp 依赖属性的更多相关文章
- [UWP]依赖属性1:概述
		1. 概述 依赖属性(DependencyProperty)是UWP的核心概念,它是有DependencyObject提供的一种特殊的属性.由于UWP的几乎所有UI元素都是集成于DependencyO ... 
- [UWP]依赖属性2:使用依赖属性
		5. 完整的自定义依赖属性 5.1 定义 /// <summary> /// 标识 Title 依赖属性. /// </summary> public static reado ... 
- [UWP]为附加属性和依赖属性自定义代码段(兼容UWP和WPF)
		1. 前言 之前介绍过依赖属性和附加属性的代码段,这两个代码段我用了很多年,一直都帮了我很多.不过这两个代码段我也多年没修改过,Resharper老是提示我生成的代码可以修改,它这么有诚意,这次就只好 ... 
- UWP &WP8.1 依赖属性和用户控件 依赖属性简单使用 uwp添加UserControl
		上面说 附加属性.这章节说依赖属性. 所谓依赖属性.白话讲就是添加一个公开的属性. 同样,依赖属性的用法和附加属性的用法差不多. 依赖属性是具有一个get,set的属性,以及反调函数. 首先是声明依赖 ... 
- win10 uwp 绑定密码
		win10 下,密码框无法绑定到ViewModel,Password是不可以绑定. 我们可以自己使用简单方法去绑定 我们之前在WPF 使用绑定密码框,我写了一篇,关于如何绑定,我提供一个我自己试了可以 ... 
- win10 uwp 如何打包Nuget给其他人
		原文:win10 uwp 如何打包Nuget给其他人 本文告诉大家,如果自己有做一些好用的库,如何使用 Nuget 打包之后上传,分享给大家. 首先需要知道一些 Nuget 打包需要知道的,请看 wi ... 
- 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 ... 
随机推荐
- 软工作业——Alpha版本第一周小结
			姓名 学号 周前计划安排 每周实际工作记录 自我打分 zxl 061425 1.进行任务分析2.进行任务分配 1.对任务进行了初步的划分,但还为进行给模块间的联系2.给每人分配了任务3.负责扫码签到功 ... 
- jQuery中的工具和插件
			jQuery的工具属性 jQuery类数组操作 length属性 表示获取类数组中元素的个数 get()方法 表示获取类数组中单个元素"括号中填写该元素的索引值" index()方 ... 
- iPhone开发之深入浅出 (7) — ARC总结
			原文链接:http://www.yifeiyang.net/development-of-the-iphone-simply-7/ 通过前面几篇文章的介绍,我想大家应该对ARC有了一个比较完整的理解. ... 
- Minitab软件是现代质量管理统计的领先者,全球六西格玛实施的共同语言,以无可比拟的强大功能和简易的可视化操作深受广大质量学者和统计专家的青睐。
			Minitab软件是现代质量管理统计的领先者,全球六西格玛实施的共同语言,以无可比拟的强大功能和简易的可视化操作深受广大质量学者和统计专家的青睐. MINITAB 功能菜单包括:基础和高级统计工具: ... 
- day4new-转自金角大王
			Python之路,Day4 - Python基础4 (new版) 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 ... 
- springMVC controller间跳转 重定向 传递参数的方法
			springMVC controller间跳转 重定向 传递参数的方法 spring MVC框架controller间跳转,需重定向.有几种情况:不带参数跳转,带参数拼接url形式跳转,带参数不拼接参 ... 
- python 逗号分隔值文件的操作
- HTML5入门指南
			1.HTML5到底是什么? HTML5是HTML最新的修订版本,2014年10月由万维网联盟(W3C)完成标准制定.目标是取代1999年所制定的HTML 4.01和XHTML 1.0标准,以期能在互联 ... 
- joinquant 策略
			代码 # 克隆自聚宽文章:https://www.joinquant.com/post/20590 # 标题:ETF单均线跟踪轮动 # 作者:那時花開海布裡 ''' ================= ... 
- python 类与类之间的关系. 特殊成员
			一.类与类之间的关系 1.依赖关系 在方法的参数位置把另一个类的对象作为参数进行传递 class Person: def play(self, tools): # 通过参数的传递把另一个类的对象传递进 ... 
