原文: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. 洛谷 SP263 Period

    洛谷 SP263 Period 题目描述 For each prefix of a given string S* with N* characters (each character has an ...

  2. [译]Vulkan教程(27)Image

    [译]Vulkan教程(27)Image Images Introduction 入门 The geometry has been colored using per-vertex colors so ...

  3. Python 教你识别淘宝刷单,买到称心如意的商品

    发际线堪忧的小 Q,为了守住头发最后的尊严,深入分析了几十款防脱洗发水的评价,最后综合选了一款他认为最完美的防脱洗发水. 一星期后,他没察觉到任何变化. 一个月后,他用卷尺量了量,发际线竟然后退了 0 ...

  4. ArrayList 与数组的“纠缠不清”的暧昧

    目录 前言 正话(个人的见解,有误请多指教) 惯例先明白它是什么? 那么它有什么用呢? 怎么用 前言 能不能有一种数组可以在删除掉某些元素自动缩小就好了.可是话说哪里学的Java?数组能删除元素吗?今 ...

  5. el-dialog模态窗点击空白不消失

    通过查阅ElementUI的官方文档,可以发现Dialog对话框组件提供了一个close-on-click-modal属性来设置el-dialog模态窗点击空白不消失. <el-dialog : ...

  6. Repeater嵌套

    我们自己观察 这是由两个重复项组成的 重复项包含重复项 而重复项的数据源是由订单号决定 即父Repeater的某数据源字段 protected void Repeater1_ItemDataBound ...

  7. 常用类-CSV---OLEDB

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  8. 首个企业架构TOGAF角色扮演案例培训的诞生

    BangEA企业架构系列在不同机构做了不少TOGAF认证课,自己都觉得有点枯燥了,我在想我们IT帮2020年第一期的认证课是不是该换种授课方式呢?想到就做......TOGAF认证培训,最早主要就是讲 ...

  9. 资深架构师教你String 常量池、 String.itern()

    什么是常量 用final修饰的成员变量表示常量,值一旦给定就无法改变! final修饰的变量有三种:静态变量.实例变量和局部变量,分别表示三种类型的常量. Class文件中的常量池 在Class文件结 ...

  10. 洗牌算法及 random 中 shuffle 方法和 sample 方法浅析

    对于算法书买了一本又一本却没一本读完超过 10%,Leetcode 刷题从来没坚持超过 3 天的我来说,算法能力真的是渣渣.但是,今天决定写一篇跟算法有关的文章.起因是读了吴师兄的文章<扫雷与算 ...