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

WPF xaml中列表依赖属性的定义
原文:WPF xaml中列表依赖属性的定义

列表内容属性

如上图,是一个列表标题排序控件,我们需要定义一个标题列表,从而让调用方可以自由的设置标题信息。

在自定义控件时,会遇到列表依赖属性,那么该如何定义呢?

下面是错误的定义方式:

 1     /// <summary>
 2     /// 标识 <see cref="Headers"/> 的依赖项属性。
 3     /// </summary>
 4     public static readonly DependencyProperty HeadersProperty = DependencyProperty.Register(
 5         "Headers", typeof(List<HeaderContent>), typeof(ListViewHeader),
 6         new PropertyMetadata(new List<HeaderContent>(), (d, e) => ((ListViewHeader)d).InitHeaderList()));
 7 
 8     /// <summary>
 9     /// 获取或设置表头的信息集合。
10     /// 由于这是依赖项属性,所以很难限制其不为 null,需要总是判空。
11     /// </summary>
12     public List<HeaderContent> Headers
13     {
14         get => (List<HeaderContent>)GetValue(HeadersProperty);
15         set => SetValue(HeadersProperty, value);
16     }

按照如上依赖属性的定义,

  • 必须提供一个默认属性new List<HeaderContent>() 或者 在自定义控件初始化时设置默认列表值,不然界面调用此列表属性去添加项,界面初始化时肯定会报错~
  • 在Xaml中显示时,不会报出一些错误提示信息~(虽然不影响正常启动,但是错误列表中一直显示,对有强迫症的我来说。。不可忍受)

正确的实现方案

  • 定义列表依赖属性:
 1     /// <summary>
 2     /// 标识 <see cref="Headers"/> 的依赖项属性。
 3     /// </summary>
 4     public static readonly DependencyProperty HeadersProperty = DependencyProperty.Register(
 5         "Headers", typeof(ListViewHeaderContentCollection), typeof(ListViewHeader),
 6         new PropertyMetadata(default(ListViewHeaderContentCollection), (d, e) => ((ListViewHeader)d).InitHeaderList()));
 7 
 8     /// <summary>
 9     /// 获取或设置表头的信息集合。
10     /// 由于这是依赖项属性,所以很难限制其不为 null,需要总是判空。
11     /// </summary>
12     public ListViewHeaderContentCollection Headers
13     {
14         get => (ListViewHeaderContentCollection)GetValue(HeadersProperty);
15         set => SetValue(HeadersProperty, value);
16     }
  • 定义列表内容集合类:

  通过实现IList<T>和IList接口,可以让列表在界面调用时,可以以列表的形式添加内容。

  注:将实现的接口方法修改下内容即可

  1     public sealed class ListViewHeaderContentCollection : IList<HeaderContent>, IList
  2     {
  3         private readonly List<HeaderContent> _headContents = new List<HeaderContent>();
  4         public IEnumerator<HeaderContent> GetEnumerator()
  5         {
  6             return _headContents.GetEnumerator();
  7         }
  8 
  9         IEnumerator IEnumerable.GetEnumerator()
 10         {
 11             return GetEnumerator();
 12         }
 13 
 14         public void Add(HeaderContent item)
 15         {
 16             _headContents.Add(item);
 17         }
 18 
 19         public int Add(object value)
 20         {
 21             _headContents.Add((HeaderContent)value);
 22             return _headContents.Count;
 23         }
 24 
 25         public bool Contains(object value)
 26         {
 27             return _headContents.Contains((HeaderContent)value);
 28         }
 29 
 30         public void Clear()
 31         {
 32             _headContents.Clear();
 33         }
 34 
 35         public int IndexOf(object value)
 36         {
 37             return _headContents.IndexOf((HeaderContent)value);
 38         }
 39 
 40         public void Insert(int index, object value)
 41         {
 42             _headContents.Insert(index, (HeaderContent)value);
 43         }
 44 
 45         public void Remove(object value)
 46         {
 47             _headContents.Remove((HeaderContent)value);
 48         }
 49 
 50         void IList.RemoveAt(int index)
 51         {
 52             _headContents.RemoveAt(index);
 53         }
 54 
 55         object IList.this[int index]
 56         {
 57             get => _headContents[index];
 58             set => _headContents[index] = (HeaderContent)value;
 59         }
 60 
 61         public bool Contains(HeaderContent item)
 62         {
 63             return _headContents.Contains(item);
 64         }
 65 
 66         public void CopyTo(HeaderContent[] array, int arrayIndex)
 67         {
 68             _headContents.CopyTo(array, arrayIndex);
 69         }
 70 
 71         public bool Remove(HeaderContent item)
 72         {
 73             return _headContents.Remove(item);
 74         }
 75 
 76         public void CopyTo(Array array, int index)
 77         {
 78             _headContents.CopyTo((HeaderContent[])array, index);
 79         }
 80 
 81         public int Count => _headContents.Count;
 82 
 83         public object SyncRoot { get; }
 84 
 85         public bool IsSynchronized { get; }
 86 
 87         public bool IsReadOnly { get; }
 88 
 89         public bool IsFixedSize { get; }
 90 
 91         public int IndexOf(HeaderContent item)
 92         {
 93             return _headContents.IndexOf(item);
 94         }
 95 
 96         public void Insert(int index, HeaderContent item)
 97         {
 98             _headContents.Insert(index, item);
 99         }
100 
101         void IList<HeaderContent>.RemoveAt(int index)
102         {
103             _headContents.RemoveAt(index);
104         }
105 
106         public HeaderContent this[int index]
107         {
108             get => _headContents[index];
109             set => _headContents[index] = value;
110         }
111     }

 调用:

posted on 2018-07-12 10:00 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/9298011.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570648.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

由于权限问题无法删除注册表键值的解决方法

在中了某个病毒之后手动删除病毒自启动项失败&#xff0c;如下图&#xff1a; 查看run项的权限&#xff0c;发现用户被修改成了Everyone&#xff0c;并且没有任何权限&#xff0c;如下图&#xff1a; 手动赋予Everyone用户完全控制权限后删除注册表项成功&#xff0c;如下图&am…

ELK篇---------elasticsearch集群安装配置

说明&#xff1a;本次ELK的基础配置如下&#xff1a;虚拟机&#xff1a;vmware 11系统&#xff1a;centos7.2 两台IP&#xff1a;172.16.1.15/16一、下载eswget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/zip/elasticsearch/2.1.0/e…

c# 常用基本函数

1、去除字符串中的所有空格 /// <summary> /// 去除字符串中的所有空格 /// </summary> /// <param name"originalStr"></param> /// <returns></returns> internal static string Tr…

c++利用windows api遍历指定文件夹及其子文件夹中的文件

以下代码在vs2008中测试通过&#xff0c;利用FindFirstFile,FindNextFile函数遍历了我电脑上全路径为“C:\\Users\\v_tianboli\\Desktop\\windows程式设计开发指南”的文件夹&#xff0c;并输出文件夹及子文件夹中的所有文件完整路径到控制台。完整代码如下&#xff1a; #inclu…

如何获取用户当前详细的地理位置

如何获取用户当前详细的地理位置 一、总结 一句话总结&#xff1a;第三方API和js中geolocation。 1、google地图API教程地址&#xff1f; Google API 教程 | 菜鸟教程http://www.runoob.com/googleapi/googleapi-tutorial.html 或者直接百度 google地图中文api 二、如何获取用户…

某释放驱动的样本分析及手杀报告

此为样本文件下载链接&#xff1a;http://download.csdn.net/detail/cs08211317dn/3982364&#xff0c;压缩包解压缩密码为&#xff1a;virus。 今天花了1个多小时分析了一款名为123.exe的病毒&#xff0c;觉得挺有意思的&#xff0c;于是顺手写个手杀报告&#xff0c;以备以后…

CentOS 7.2 安装zabbix 3.4

一、zabbix版本选择及部署环境说明 1、zabbix版本选择 zabbix官网地址&#xff1a;www.zabbix.com zabbix每半年发布一个长期支持版&#xff0c;目前长期支持版有2.0、3.0等&#xff0c;所以选择zabbix版本建议选择长期支持版&#xff0c;除非有特殊需求。 2、部署环境环境说明…

吴恩达机器学习笔记(二) —— Logistic回归

主要内容&#xff1a; 一.回归与分类 二.Logistic模型即sigmoid function 三.decision boundary 决策边界 四.cost function 代价函数 五.梯度下降 六.自带求解函数 七.多分类问题 一.回归与分类 回归&#xff1a;用于预测&#xff0c;输出值是连续型的。例如根据房子的大小预测…

弹出选择文件夹的对话框 BROWSEINFO 的用法【MFC】

以下是在vs2008中编译通过的代码&#xff0c;代码注释详细。要实现的功能是点击“浏览”按钮&#xff0c;即弹出选择文件夹的对话框。并将选择的文件夹或文件路径显示在MessageBox中。 void CMFC_TrojanKillerDlg::OnBnClickedButton1() {// TODO: 在此添加控件通知处理程序代码…

HDU 3709 Balanced Number(数位DP)题解

思路&#xff1a; 之前想直接开左右两边的数结果爆内存... 枚举每次pivot的位置&#xff0c;然后数位DP&#xff0c;如果sum<0返回0&#xff0c;因为已经小于零说明已经到了pivot右边&#xff0c;继续dfs只会越来越小&#xff0c;且dp数组会炸 注意一下一些细节&#xff1a;…

regini.exe使用方法

创建一个名称test 类型reg_dword 数据1 如果是只有那会默认以类型reg_sz创建 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\ys test reg_dword 1 2。注册表键数值 [更改的权限] 例如: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run…

不断的感悟、不断的学习、不断的成长

学习思想、勤于实践 学习目的、看靶放箭 学习总结、不断提升 --------------------------------------------------------------------------------------------------------------                        爱学习、勤学习 爱看书、勤看书       …

汇编指令大全

[数据传送指令] 一、通用数据传送指令 1、传送指令 MOV (move) 指令的汇编格式&#xff1a;MOV DST,SRC 指令的基本功能&#xff1a;(DST)<-(SRC) 将原操作数(字节或字)传送到目的地址。 指令支持的寻址方式&#xff1a;目的操作数和源操作数不能同时用存储器寻址方式&…

深度优先搜索----poj 1321棋盘问题

题目描述 棋盘问题 Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 63237 Accepted: 30234Description 在一个给定形状的棋盘&#xff08;形状可能是不规则的&#xff09;上面摆放棋子&#xff0c;棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或…

计算机寄存器及标志位详解

以下是计算机内部寄存器阵列图&#xff1a; 以下FR控制标志位及其含义&#xff1a; 1. CF 进位标识位 进行加减运算时, 如果最高二进制位产生进位或错位, CF则为1, 否则为0. 程序设计中, 常用条件转移指令JC, JNC指令据此标志位实现转移 2. PF 奇偶标志位 操作结果…

NOIP 2010 引水入城

P1514 引水入城 题目描述 在一个遥远的国度&#xff0c;一侧是风景秀美的湖泊&#xff0c;另一侧则是漫无边际的沙漠。该国的行政区划十分特殊&#xff0c;刚好构成一个 NN 行 \times MM 列的矩形&#xff0c;如上图所示&#xff0c;其中每个格子都代表一座城市&#xff0c;每座…

关于IE8的SCODEF和 CREDAT

这里提供一些信息供理解IE8中的松散耦合处理方式。 由于IE8的LCIE更新&#xff0c; 现在比较难知道当前的tab是哪个iexplore.exe在处理。 如果你在用vista以上的系统&#xff0c; 任务管理器里有两列可以提供信息&#xff0c;分别是 commandline 和 pid&#xff0c; 如果这两列…

Cacls命令使用格式

Cacls命令使用格式如下&#xff1a; Cacls filename [/T] [/E] [/C] [/G user:perm] [/R user [...]] [/P user:perm [...]] [/D user [...]] Filename——显示访问控制列表&#xff08;以下简称ACL&#xff09;&#xff1b; /T——更改当前目录及其所有子目录中指定文件的 ACL…

前段mui框架初识

由于需要了解了一下mui框架&#xff0c;感觉没有想象的那么好 mui引入过后就要生成他自己的滚动条 而且 不能获取页面的高度 非屏幕的高度 mui上拉加载是会有卡顿现象的 &#xff0c; 这段代码执行完之后会有比较严重的手机段拖动卡顿现象 解决办法 给他设置滚动系数&#…

attrib指令

attrib 指令用于修改文件的属性.文件的常见属性有:只读.存档.隐藏和系统. 只读属性是指文件只可以做读的操作.不能对文件进行写的操作.就是文件的 写保护 . 存档属性是用来标记文件改动的.即在上一次备份后文件有所改动.一些备份软件在备份的时候会只去备份带有存档属性的文件.…