WPF 依赖属性

Posted lonelyxmas

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF 依赖属性相关的知识,希望对你有一定的参考价值。

原文:WPF 依赖属性

什么是依赖属性

在WPF上是一种特殊的值存储手段,主要是利用键值对原理,通过全局维护的方式进行保存和更新。

主要作用于控件的属性值保存,读取。在XAML中会有特殊的处理,包括读取,存储,都是有特殊的对待。

使用方式主要是可读可写,只读两种。

当你实现一个依赖属性,其派生类(依赖属性必须是继承DependencyObject类,才能够编写)是可以对其值复写。

由于依赖属性并不是CRL属性,所以是有特殊的写法,但是依赖属性是通过CRL属性进行值的更新和获取。

 

实现方式

依赖属性是具有特殊写法。

由public static readyonly 作范围限制。并且是通过DependencyProperty类的静态注册方法进行注册。

技术图片
    class NewGrid : Grid
    {
        public static readonly DependencyProperty ObjectProperty = DependencyProperty.Register("Object", typeof(object), typeof(NewGrid), new PropertyMetadata(null, new PropertyChangedCallback(OnValueChanged)));

        private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (e.NewValue != null)
                MessageBox.Show(e.NewValue.ToString());
        }

        public object Object
        {
            get
            {
                return GetValue(ObjectProperty);
            }
            set
            {
                SetValue(ObjectProperty, value);
            }
        }
        
    }
技术图片

 很明显,register的方法的形参很多,而且对于依赖属性的名称也是有要求的。

 

简单的解释一下register的形参,第一位是注册时的名称,第二位依赖属性存储时值的类型,第三位依赖属性是属于谁,第四位是一个元数据其中分别是 第一位 初始值,第二个是当依赖属性接收到新值时发生的事件

 

这里面非常特别注意的是:依赖属性的变量结尾是Property,依赖属性的注册名称是变量名除去Property的部分,依赖属性的值读写是通过CRL属性实现,并且名称是和注册用的名称相同。

 

当我们完成一次正确的依赖属性编写后,xaml上使用时会正确的识别类型,存储的值。

例如我们将上文的代码稍微修改成

技术图片
   public enum ObjectSourceTypeEnum
    {
        String = 1,
        Object = 2,
        Int = 3,
        Doubble = 4,

    }
    class NewGrid : Grid
    {
        public static readonly DependencyProperty ObjectSourceTypeProperty = DependencyProperty.Register("ObjectSourceType", typeof(ObjectSourceTypeEnum), typeof(NewGrid), new PropertyMetadata(ObjectSourceTypeEnum.String, new PropertyChangedCallback(OnValueChanged)));

        private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (e.NewValue != null)
                MessageBox.Show(e.NewValue.ToString());
        }

        public ObjectSourceTypeEnum ObjectSourceType
        {
            get
            {
                return (ObjectSourceTypeEnum)GetValue(ObjectSourceTypeProperty);
            }
            set
            {
                SetValue(ObjectSourceTypeProperty, value);
            }
        }

    }
技术图片

 

在xaml中则会正确识别

技术图片

 

同时,当你使用依赖属性时,也会带来一个好处就是使用绑定。

技术图片
 <Window.Resources>
        <ObjectDataProvider x:Key="value" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
            <ObjectDataProvider.MethodParameters>
                <x:Type Type="{x:Type local:ObjectSourceTypeEnum}"/>
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </Window.Resources>
    <local:NewGrid x:Name="grid"   ObjectSourceType="{Binding ElementName=combobox,Path=SelectedItem}" >
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="auto"/>
        </Grid.RowDefinitions>
        <TextBlock VerticalAlignment="Top" HorizontalAlignment="Left" Text="{Binding  ElementName=grid,Path=ObjectSourceType}"/>
        <ComboBox x:Name="combobox" Grid.Row="1"  ItemsSource="{Binding Source={StaticResource value}}"  SelectedIndex="0"  />
    </local:NewGrid>
技术图片

技术图片

 

以上是关于WPF 依赖属性的主要内容,如果未能解决你的问题,请参考以下文章

WPF--属性系统

wpf 自定义控件combobox 依赖属性

WPF基础教程之属性系统

WPF利用依赖属性和命令编写自定义控件

WPF .NET Core - 如何找到依赖属性更改事件的来源?

WPF中的依赖属性