Wpf 依赖项属性如何告诉要应用到的对象?
(我对这个概念完全陌生,所以我可能会问一些非常基本的问题。) 已使用以下代码注册依赖项属性:Wpf 依赖项属性如何告诉要应用到的对象?,wpf,dependency-properties,Wpf,Dependency Properties,(我对这个概念完全陌生,所以我可能会问一些非常基本的问题。) 已使用以下代码注册依赖项属性: public static DependencyProperty Register(string name, Type propertyType, Type ownerType, PropertyMetadata typeMetadata); 从逻辑上讲,它只将属性名与所有者类型关联 因此,如果我有多个所有者类型的实例,并且每个实例都将DP设置为不同的值 如何存储这些值 更新1-2013年10月30日
public static DependencyProperty Register(string name, Type propertyType, Type ownerType, PropertyMetadata typeMetadata);
从逻辑上讲,它只将属性名与所有者类型关联
因此,如果我有多个所有者类型的实例,并且每个实例都将DP设置为不同的值
如何存储这些值
更新1-2013年10月30日上午10:04
我从这里了解到所附财产:
附加属性
附加属性是一种特殊的从属属性。他们
允许您将值附加到不知道任何内容的对象
关于这个值
这一概念的一个很好的例子是布局面板。每个布局面板
需要不同的数据来对齐其子元素。帆布需要上漆
左边,DockPanel需要Dock等,因为你可以自己写
布局面板,列表是无限的。所以你看,这是不可能的
在所有WPF控件上具有所有这些属性
解决方案是附加的属性。它们由控件定义
这需要来自特定上下文中另一个控件的数据。对于
示例:由父布局面板对齐的图元
因此,在下面的代码片段中:
<Canvas>
<Button Canvas.Top="20" Canvas.Left="20" Content="Click me!"/>
<Button Canvas.Top="40" Canvas.Left="20" Content="Click me!"/>
</Canvas>
但我不明白为什么附加属性必须是依赖属性?它们之间有什么联系
谢谢 通常,当我们定义
dependencProperty
时,我们还定义了一个CLR“包装器”,使我们能够在代码中使用dependencProperty
:
public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register(
"Items", typeof(ObservableCollection<string>), typeof(MainWindow),
new UIPropertyMetadata(new ObservableCollection<string>()));
public ObservableCollection<string> Items
{
get { return (ObservableCollection<string>)GetValue(ItemsProperty); }
set { SetValue(ItemsProperty, value); }
}
公共静态只读DependencyProperty项属性=DependencyProperty.Register(
“项目”、类型(可观测集合)、类型(主窗口),
新的UIPropertyMetadata(新的ObservableCollection());
公共可观测收集项目
{
get{return(ObservableCollection)GetValue(ItemsProperty);}
set{SetValue(ItemsProperty,value);}
}
在这里,您可以看到@Clemens所讨论的GetValue
和SetValue
方法。我们可以在窗口
和/或用户控件
中访问这些方法,因为它们都扩展了依赖对象
类。您还可以看到这里的项
属性不是静态的
。。。正是dependencProperty
的定义才是static
更新>>> 问为什么附加属性必须是
从属属性
,其实没有多大意义?因为在.NET中,他们只是。。。它们就是这样设计的。一个更好的问题可能是,附加属性作为从属属性
有什么好处
对于这一点的回答与当被问到作为从属财产的财产有什么好处时是一样的?主要的好处是这些属性可以用于绑定
s、样式
s、动画
s和资源
等。对于任何WPF开发人员,可以从MSDN上的两个非常重要的页面(已链接到评论中)中找到更多详细信息:
要回答您的问题,我需要从依赖系统的基础知识开始(您已经知道下面的大部分内容,但我认为在阅读之后,您的问题可能会自己回答)
dependencProperty
应该在派生自DependencyObject
的类中定义,因为DependencyObject
实现了一些方法和成员(其中大多数是私有的,开发人员看不到)。这些实现为DependencyObject
提供了通过静态引用类(而不是引用类的实例)来存储和检索数据的能力
我们存储和检索数据的方式是通过dependencProperty
的包装器,或者直接通过GetValue和SetValue(它们是DependencyObject
的方法)或通过绑定。无论哪种方式,staticdependencProperty
都是找到正确值的“键”
当您注册一个DependencyProperty
时,依赖关系系统会被告知一个新的DependencyProperty
已添加到其资源中(类似于一个列表,其中填充了您已注册的DependencyProperty)。现在,如果您将某些内容存储为[this.]SetValue(MyProperty,value)
,那么您实际上是在更新对象this
(您可以将其想象为this.Resources[MyProperty]
)的资源
这就像外部的普通属性一样,但考虑到UIPropertyMetadata
和其他依赖性
内容,您的DependencyProperty
配备了一些独特的强制、参与动画、更改时通知等功能,并且可以完成比简单属性多得多的功能
还记得分机吗
public static void MyExtension(this MyType target, string parameter, ...)
{
target.MyFunction(parameter, ...);
}
var t = new MyType();
t.MyExtension("test");
AttachedProperty
某种程度上是dependencProperty
和扩展的组合,但有一些区别:
AttachedProperty
的包装器是静态的,并将类引用作为输入,以了解它们的附加位置。dependencProperty
的目标通常是this
(除非您将GetValue和SetValue更改为类似于otherObject.SetValue(MyProperty,value)
)。但与DependencyProperty
不同,AttachedProperty
的目标(必须是DependencyObject
本身)作为参数传递给它。同样,它必须是DependencyObject
的原因是,只有DependencyObject
能够拥有一组资源来存储dependencProperty
与使用寄存器的dependencProperty
不同,attachedProperty
public static void MyExtension(this MyType target, string parameter, ...)
{
target.MyFunction(parameter, ...);
}
var t = new MyType();
t.MyExtension("test");