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
的方法)或通过绑定。无论哪种方式,static
dependencProperty
都是找到正确值的“键”

当您注册一个
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");