原文:2018-8-10-win10-uwp-依赖属性

title author date CreateTime categories
win10 uwp 依赖属性
lindexi
2018-08-10 19:17:19 +0800
2018-2-13 17:23:3 +0800
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);
}

2018-8-10-win10-uwp-依赖属性的更多相关文章

  1. win10 uwp 依赖属性

    本文告诉大家如何使用依赖属性,包括在 UWP 和 WPF 如何使用. 本文不会告诉大家依赖属性的好处,只是简单告诉大家如何使用 在 UWP 和 wpf ,如果需要创建自己的依赖属性,可以使用代码片,在 ...

  2. [UWP]依赖属性1:概述

    1. 概述 依赖属性(DependencyProperty)是UWP的核心概念,它是有DependencyObject提供的一种特殊的属性.由于UWP的几乎所有UI元素都是集成于DependencyO ...

  3. [UWP]依赖属性2:使用依赖属性

    5. 完整的自定义依赖属性 5.1 定义 /// <summary> /// 标识 Title 依赖属性. /// </summary> public static reado ...

  4. 背水一战 Windows 10 (67) - 控件(控件基类): DependencyObject - CoreDispatcher, 依赖属性的设置与获取, 依赖属性的变化回调

    [源码下载] 背水一战 Windows 10 (67) - 控件(控件基类): DependencyObject - CoreDispatcher, 依赖属性的设置与获取, 依赖属性的变化回调 作者: ...

  5. [UWP]为附加属性和依赖属性自定义代码段(兼容UWP和WPF)

    1. 前言 之前介绍过依赖属性和附加属性的代码段,这两个代码段我用了很多年,一直都帮了我很多.不过这两个代码段我也多年没修改过,Resharper老是提示我生成的代码可以修改,它这么有诚意,这次就只好 ...

  6. 背水一战 Windows 10 (78) - 自定义控件: 基础知识, 依赖属性, 附加属性

    [源码下载] 背水一战 Windows 10 (78) - 自定义控件: 基础知识, 依赖属性, 附加属性 作者:webabcd 介绍背水一战 Windows 10 之 控件(自定义控件) 自定义控件 ...

  7. 【转】【译】在 Windows 10 应用程序中注册任意依赖属性的改变

    原文地址:http://visuallylocated.com/post/2015/04/01/Registering-to-any-DependencyProperty-changing-in-Wi ...

  8. UWP &WP8.1 依赖属性和用户控件 依赖属性简单使用 uwp添加UserControl

    上面说 附加属性.这章节说依赖属性. 所谓依赖属性.白话讲就是添加一个公开的属性. 同样,依赖属性的用法和附加属性的用法差不多. 依赖属性是具有一个get,set的属性,以及反调函数. 首先是声明依赖 ...

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

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

  10. win10 uwp 商业游戏 1.1.5

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

随机推荐

  1. 女朋友会 Python 是多么可怕的一件事!

    ​ 阅读文本大概需要 8 分钟. 1 目 标 场 景 女朋友会 Python 是多么可怕的一件事! 一位朋友告诉忽略了一件事,假设女朋友会 Python 的话,那岂不是要翻车?如果是这样的话,女朋友发 ...

  2. 1025 PAT Ranking 双重排序

    Programming Ability Test (PAT) is organized by the College of Computer Science and Technology of Zhe ...

  3. 双链表算法原理【Java实现】(八)

    前言 前面两节内容我们详细介绍了ArrayList,一是手写实现ArrayList数据结构,而是通过分析ArrayList源码看看内置实现,关于集合内容一如既往,本节课我们继续学习集合LinkedLi ...

  4. Java生鲜电商平台-商家支付系统与对账系统架构实战

    Java生鲜电商平台-商家支付系统与对账系统架构实战 说明:关于生鲜电商平台,支付系统是连接消费者.商家(或平台)和金融机构的桥梁,管理支付数据,调用第三方支付平台接口,记录支付信息(对应订单号,支付 ...

  5. maven仓库之第二篇

    1. 什么是maven? 它是一个软件开发的管理工具,主要管理的工作是:依赖管理,项目构建. 2. 使用maven的好处? 能够集中管理jar包,提供一键构建. 3. maven的安装及配置 配置:M ...

  6. js相同的正则多次调用test()返回的值却不同

    项目中文件上传需要验证文件的格式,第一次正常,第二次就验证不通过了.在验证的地方console.log()两遍,发现结果不一样 !!! 正则和文件名都没变,但是两次的验证结果不同. this.reg ...

  7. js基础——错误处理

    一:错误捕获 1.try-catch 语句(错误捕获) try{ //这里放置可能出现问题的代码 }catch(error){ //错误发生时执行的代码 console.log(error.name) ...

  8. Python 元組 Tuple

    元組 Tuple 宣告 元組是用逗號分隔的一列值: >>> t = 'a',1,'b',2,'c',3>>> t('a', 1, 'b', 2, 'c', 3)&g ...

  9. SAP OB52会计年度变式

    Var.(Posting Period Variant) 记帐区间变式,每个公司代码对应一个记帐期间变式,多个公司代码可以使用一个相同的记帐期间变式 A(Performance Assistant) ...

  10. coalesce搭配nullif使用

    with t1 as ( select NUll as col1, '' as col2, 'aaa' as col3 ) --关于COALESCE用法 当col1 为 Null时候返回 col2 依 ...