WPF xaml中列表依赖属性的定义
列表内容属性

如上图,是一个列表标题排序控件,我们需要定义一个标题列表,从而让调用方可以自由的设置标题信息。
在自定义控件时,会遇到列表依赖属性,那么该如何定义呢?
下面是错误的定义方式:
/// <summary>
/// 标识 <see cref="Headers"/> 的依赖项属性。
/// </summary>
public static readonly DependencyProperty HeadersProperty = DependencyProperty.Register(
"Headers", typeof(List<HeaderContent>), typeof(ListViewHeader),
new PropertyMetadata(new List<HeaderContent>(), (d, e) => ((ListViewHeader)d).InitHeaderList())); /// <summary>
/// 获取或设置表头的信息集合。
/// 由于这是依赖项属性,所以很难限制其不为 null,需要总是判空。
/// </summary>
public List<HeaderContent> Headers
{
get => (List<HeaderContent>)GetValue(HeadersProperty);
set => SetValue(HeadersProperty, value);
}
按照如上依赖属性的定义,
- 必须提供一个默认属性new List<HeaderContent>() 或者 在自定义控件初始化时设置默认列表值,不然界面调用此列表属性去添加项,界面初始化时肯定会报错~
- 在Xaml中显示时,不会报出一些错误提示信息~(虽然不影响正常启动,但是错误列表中一直显示,对有强迫症的我来说。。不可忍受)
正确的实现方案
- 定义列表依赖属性:
/// <summary>
/// 标识 <see cref="Headers"/> 的依赖项属性。
/// </summary>
public static readonly DependencyProperty HeadersProperty = DependencyProperty.Register(
"Headers", typeof(ListViewHeaderContentCollection), typeof(ListViewHeader),
new PropertyMetadata(default(ListViewHeaderContentCollection), (d, e) => ((ListViewHeader)d).InitHeaderList())); /// <summary>
/// 获取或设置表头的信息集合。
/// 由于这是依赖项属性,所以很难限制其不为 null,需要总是判空。
/// </summary>
public ListViewHeaderContentCollection Headers
{
get => (ListViewHeaderContentCollection)GetValue(HeadersProperty);
set => SetValue(HeadersProperty, value);
}
- 定义列表内容集合类:
通过实现IList<T>和IList接口,可以让列表在界面调用时,可以以列表的形式添加内容。
注:将实现的接口方法修改下内容即可
public sealed class ListViewHeaderContentCollection : IList<HeaderContent>, IList
{
private readonly List<HeaderContent> _headContents = new List<HeaderContent>();
public IEnumerator<HeaderContent> GetEnumerator()
{
return _headContents.GetEnumerator();
} IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
} public void Add(HeaderContent item)
{
_headContents.Add(item);
} public int Add(object value)
{
_headContents.Add((HeaderContent)value);
return _headContents.Count;
} public bool Contains(object value)
{
return _headContents.Contains((HeaderContent)value);
} public void Clear()
{
_headContents.Clear();
} public int IndexOf(object value)
{
return _headContents.IndexOf((HeaderContent)value);
} public void Insert(int index, object value)
{
_headContents.Insert(index, (HeaderContent)value);
} public void Remove(object value)
{
_headContents.Remove((HeaderContent)value);
} void IList.RemoveAt(int index)
{
_headContents.RemoveAt(index);
} object IList.this[int index]
{
get => _headContents[index];
set => _headContents[index] = (HeaderContent)value;
} public bool Contains(HeaderContent item)
{
return _headContents.Contains(item);
} public void CopyTo(HeaderContent[] array, int arrayIndex)
{
_headContents.CopyTo(array, arrayIndex);
} public bool Remove(HeaderContent item)
{
return _headContents.Remove(item);
} public void CopyTo(Array array, int index)
{
_headContents.CopyTo((HeaderContent[])array, index);
} public int Count => _headContents.Count; public object SyncRoot { get; } public bool IsSynchronized { get; } public bool IsReadOnly { get; } public bool IsFixedSize { get; } public int IndexOf(HeaderContent item)
{
return _headContents.IndexOf(item);
} public void Insert(int index, HeaderContent item)
{
_headContents.Insert(index, item);
} void IList<HeaderContent>.RemoveAt(int index)
{
_headContents.RemoveAt(index);
} public HeaderContent this[int index]
{
get => _headContents[index];
set => _headContents[index] = value;
}
}
调用:

WPF xaml中列表依赖属性的定义的更多相关文章
- xaml中的依赖属性
wpf使用依赖属性完成数据绑定.动画.属性变更通知.样式化等.对于数据绑定.绑定到.NET属性源上的UI元素的属性必须是依赖属性 .net的一般属性定义如下 private int val; ...
- WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性
原文:WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性 如果你要自定义一个图片按钮控件,那么如何在主窗体绑定这个控件上图片的Source呢? ...
- WPF中的依赖属性
1. WPF中的依赖属性 依赖属性是专门基于WPF创建的.在WPF库实现中,依赖属性使用普通的C#属性进行了包装,使用方法与普通的属性是相同的. 1.1 依赖属性提供的属性功能 资源 数据绑定 样式 ...
- WPF ----在UserControl的xaml里绑定依赖属性
场景:在定义wpf 用户控件的时候,希望使用时设置自定义的属性来改变用户控件里的状态或内容等. 下面直接上实例代码: 用户控件的后台代码,定义依赖属性 public partial class MyU ...
- WPF学习笔记一 依赖属性及其数据绑定
本文想通过由浅入深的讲解让读者比较深的理解依赖属性. 首先,我们回顾一下依赖属性的发展历史. 最初,人们提出面向对象编程时,并没有属性这个说法,当时叫做成员变量.一个对象由成员变量和成员函数组成,如 ...
- WPF学习笔记二 依赖属性实现原理及性能分析
在这里讨论依赖属性实现原理,目的只是学习WPF是怎么设计依赖属性的,同时更好的使用依赖属性. 首先我们来思考一个简单的问题:我们希望能验证属性的值是否有效,属性变更时进行自己的处理.回顾一下.net的 ...
- ReferentialConstraint 中的依赖属性映射到由存储生成的列
ReferentialConstraint 中的依赖属性映射到由存储生成的列 这个问题是由于从表中的外键关系建立错误(可能是由于误改),查看从表的所有外键关系,即可找到问题所在. 问题: 什么是从表? ...
- Entity Framework问题:ReferentialConstraint 中的依赖属性映射由存储生成的列
原文:Entity Framework问题:ReferentialConstraint 中的依赖属性映射由存储生成的列 今天在采用Entity Framework 的Database First反向以 ...
- (原创)2. WPF中的依赖属性之二
1 依赖属性 1.1 依赖属性最终值的选用 WPF属性系统对依赖属性操作的基本步骤如下: 第一,确定Base Value,对同一个属性的赋值可能发生在很多地方.还用Button的宽度来进行举例,可能在 ...
随机推荐
- Golang Go Go Go part3:数据类型及操作
五.Go 基本类型 1.基本类型种类 布尔值: bool 长度 1字节 取值范围 true, false注意事项:不可用数字代表 true 或 false 整型: int/uint 根据运行平台可能为 ...
- 【RL-TCPnet网络教程】第16章 UDP用户数据报协议基础知识
第16章 UDP用户数据报协议基础知识 本章节为大家讲解UDP(User Datagram Protocol,用户数据报协议),需要大家对UDP有个基础的认识,方便后面章节UDP实战操作. ...
- SpringBoot 集成 Swageer2
添加Maven依赖 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox ...
- [Swift]LeetCode397. 整数替换 | Integer Replacement
Given a positive integer n and you can do operations as follow: If n is even, replace n with n/2. If ...
- Python内置函数(46)——oct
英文文档: oct(x) Convert an integer number to an octal string. The result is a valid Python expression. ...
- docker 常用命令记录
下载镜像 docker pull imagesName 查看所有镜像 docker images 查看当前运行的镜像 docker ps 运行镜像 docker run imagesName 停止运行 ...
- expect--自动批量分发公钥脚本
1.在使用之前,先安装epel源,yum install expect -y2.写分发脚本,后缀为exp #!/usr/bin/expect set host_ip [lindex $argv 0] ...
- 【从零开始自制CPU之学习篇03】锁存器与触发器
本篇学习了两种锁存器:SR Latch和D Latch,一种触发器:D flip flop SR Latch:SR—锁存器 初始状态下,S和R都为0,Q和Q‘随机有一个为1另一个 为0(取决于电流速度 ...
- redis 系列18 事件
一.概述 Redis服务器是一个事件驱动程序,服务器需要处理两类事件:1文件事件,2时间事件.文件事件是关于客户端与服务器之间的通信操作.时间事件是关于服务器内部的一些定时操作.本篇还是参照" ...
- 由Nginx的DNS缓存导致的访问404
现象 访问某个URL出现404,而且全站都是404.通过日志查看Nginx的规则也正确,请求被代理到指定位置. 排查 最近针对这个站点没有修改过Nginx配置也没有站点升级.所以应该是其他原因.首先P ...