原文:WPF依赖属性值源(BaseValueSource)

 

WPF依赖属性提供一个机制,可以获取依赖属性提供值的来源

其以BaseValueSource枚举表示

1.Default

public static readonly DependencyProperty WorkingTagProperty = DependencyProperty.Register(
"WorkingTag",
typeof(object),
typeof(CustomControl),
new UIPropertyMetadata("<working tag>"));

2.DefaultStyle和DefaultStyleTrigger(Style和StyleTrigger)

注意点:若即定义在外部程序集中的默认控件样式则为DefaultStyle和DefaultStyleTrigger,否则定义在本地项目(如在Application中重新定义控件样式,则为Style和StyleTrigger)

3.TemplateTrigger和ParentTemplateTrigger

在模板中触发

        <ControlTemplate TargetType="{x:Type local:CustomControl}">
<Button x:Name="Part_Button" Content="{TemplateBinding Title}"
IsEnabled="{TemplateBinding IsEnabled}" Background="{TemplateBinding Background}" />
<ControlTemplate.Triggers>
<Trigger SourceName="Part_Button" Property="IsEnabled" Value="False">
<Setter Property="Title" Value="disable test text"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>

4.ParentTemplate

当模板中有定义内部控件样式模板时,内部控件值变更由上级模板触发

下面TextBlock的Text的触发源为ParentTemplate

        <Style TargetType="{x:Type local:CustomControl}">
<Setter Property="Title" Value="default test text" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomControl}">
<ControlTemplate.Resources>
<Style TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<TextBlock Text="{TemplateBinding Content}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ControlTemplate.Resources>
<Border>
<Button x:Name="Part_Button" Content="{TemplateBinding Title}"
IsEnabled="{TemplateBinding IsEnabled}" Background="{TemplateBinding Background}" />
</Border>
<ControlTemplate.Triggers>
<Trigger SourceName="Part_Button" Property="IsEnabled" Value="False">
<Setter Property="Title" Value="disable test text"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

5.Local

即本地调用了SetValue方法

public object WorkingTag
{
get { return GetValue(WorkingTagProperty); }
set { SetValue(WorkingTagProperty, value); }
}

6.Inherited

属性继承是一个向下包容继承的关系

由属性继承值更改触发,如文字大小(FontSize)就是一个继承关系,更改根元素,那么子元素就全会更改

此功能也可以用来debug用,用来检测值是由何时修改的.

.net 4.0新增方法

DependencyObject ..::. SetCurrentValue 方法

这个方法类似SetValue方法,但SetCurrentValue 不会去修改属性值源(即何处修改属性值)

参考文档:

http://msdn.microsoft.com/en-us/library/ms743230.aspx

参考绑定时bug

http://blogs.msdn.com/b/vinsibal/archive/2009/03/24/the-control-local-values-bug.aspx

http://blogs.msdn.com/b/vinsibal/archive/2009/05/21/the-control-local-values-bug-solution-and-new-wpf-4-0-related-apis.aspx

http://arbel.net/blog/archive/2009/11/04/local-values-in-dependencyobjects.aspx

WPF依赖属性值源(BaseValueSource)的更多相关文章

  1. WPF依赖属性(续)(2)依赖属性与附加属性的区别

    原文:WPF依赖属性(续)(2)依赖属性与附加属性的区别        接上篇,感谢各位的评论,都是认为依赖属性的设计并不是为了节省内存,从大的方面而讲是如此.样式,数据绑定,动画样样都离不开它.这篇 ...

  2. WPF自学入门(五)WPF依赖属性

    在.NET中有事件也有属性,WPF中加入了路由事件,也加入了依赖属性.最近在写项目时还不知道WPF依赖属性是干什么用的,在使用依赖项属性的时候我都以为是在用.NET中的属性,但是确实上不是的,通过阅读 ...

  3. WPF依赖属性(续)(3)依赖属性存储

    原文:WPF依赖属性(续)(3)依赖属性存储          在之前的两篇,很多朋友参与了讨论,也说明各位对WPF/SL计数的热情,对DP系统各抒已见,当然也出现了一些分歧. 以下简称DP为依赖属性 ...

  4. WPF依赖属性(续)(1)

    原文:WPF依赖属性(续)(1)                 之前有写过几篇文章,详细地介绍了依赖属性的基本使用方法,如果你不想了解其内部实现机制的话,那么通过那两篇文章的介绍,足以应付平时的应用 ...

  5. WPF依赖属性的正确学习方法

    前言 我在学习WPF的早期,对依赖属性理解一直都非常的不到位,其恶果就是,我每次在写依赖属性的时候,需要翻过去的代码来复制黏贴. 相信很多朋友有着和我相同的经历,所以这篇文章希望能帮助到那些刚刚开始学 ...

  6. WPF 依赖属性前言

    WPF 依赖属性前言 ​ 在.net中,我们可以属性来获取或设置字段的值,不需要在编写额外的get和set方法,但这有一个前提,那就是需要在对象中拥有一个字段,才能在此字段的基础上获取或设置字段的值, ...

  7. WPF依赖属性详解

    WPF依赖属性详解 WPF 依赖属性 英文译为 Dependency Properties,是WPF引入的一种新类型的属性,在WPF中有着极为广泛的应用,在WPF中对于WPF Dependency P ...

  8. 监听WPF依赖属性

    原文:监听WPF依赖属性 当我们使用依赖属性的时候,有时需要监听它的变化,这在写自定义控件的时候十分有用, 下面介绍一种简单的方法.   如下使用DependencyPropertyDescripto ...

  9. WPF 依赖属性源码 洞察微软如何实现DependencyProperty

    依赖属性DependencyProperty是wpf最重要的一个类,理解该类如何实现对学习wpf帮助很大! 终于找到了该类的源码!仔细阅读源码,看看微软如何玩的花招! File: Base\Syste ...

随机推荐

  1. WebClient 请求返回的是Gbk编码解决方案

    WebClient client = new WebClient();                client.Headers.Clear();                client.Hea ...

  2. NSString常见用法

    1.创建常量字符串 NSString *str = @"Hello World!"; 2.创建空字符串,给予赋值 NSString *str = [[NSString alloc] ...

  3. C#判断操作系统类型

    操作系统  PlatformID  主版本号  副版本号  Windows95  1  4  0  Windows98  1  4  10  WindowsMe  1  4  90  WindowsN ...

  4. OCulus Rift 游戏开发六原则

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/46685477 作者:car ...

  5. redis 的惊群处理和分布式锁的应用例子

    在并发量比较高的情况下redis有很多应用场景,提升查询效率,缓解底层DBio ,下面列举两个平时开发中应用过的两个例子,欢迎各位一起讨论改进. 1 . redis 惊群处理 1.1 方案的由来 Re ...

  6. AE中地图查询方式

    樱木 原文 AE中地图查询方式 地图查询主要有两种查询:空间查询和属性查询 所用到知识点: 1  Cursor(游标)对象 本质上是一个指向数据的指针,本身不包含数据内容,提供一个连接到ROW对象或者 ...

  7. spark安装与调试

    I---- 1---jdk and scala install ****zyp@ubuntu:~/Desktop/software$ tar xvf jdk-7u67-linux-i586.tar.g ...

  8. JSON序列化自己主动过滤NULL值

    使用Newtonsoft.Json.dll 序列化为json时主动将NULL值过滤掉.详细做法: var jSetting = new JsonSerializerSettings {NullValu ...

  9. python opencv3 —— findContours

    findContours 是 opencv 下的轮廓提取函数. 1. api 分析 findContours(image, mode, method[, contours[, hierarchy[, ...

  10. [Git] How to rename your remote branch

    Rename your local foo branch with bar: git branch -m foo bar Remember this will add the new branch w ...