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 属性
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现