原文: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     }

调用:

WPF xaml中列表依赖属性的定义相关推荐

  1. WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性

    原文:WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性 如果你要自定义一个图片按钮控件,那么如何在主窗体绑定这个控件上图片的Source呢? ...

  2. WPF ----在UserControl的xaml里绑定依赖属性

    场景:在定义wpf 用户控件的时候,希望使用时设置自定义的属性来改变用户控件里的状态或内容等. 下面直接上实例代码: 用户控件的后台代码,定义依赖属性 public partial class MyU ...

  3. WPF学习笔记一 依赖属性及其数据绑定

    本文想通过由浅入深的讲解让读者比较深的理解依赖属性.  首先,我们回顾一下依赖属性的发展历史. 最初,人们提出面向对象编程时,并没有属性这个说法,当时叫做成员变量.一个对象由成员变量和成员函数组成,如 ...

  4. XAML和其依赖属性

    一.XAML 在WPF之前设计图形用户界面往往使用一种语言.但在WPF当中,由于 引入了XAML语言.因此在界面设计方面,一般使用XAML语言,而在业务逻辑上使用C#或者VB这样的后台代码.XAML语 ...

  5. WPF XAML 资源样式模板属性存放位置

    WPF XAML 资源样式模板属性存放位置 原文:WPF XAML 资源样式模板属性存放位置 WPF的XAML 资源申明 类似HTML. 整体来说分3种 1.行类资源样式属性 1.1 行内属性 < ...

  6. WF:要想绑到两个活动的属性值---依赖属性的定义方法

    WF中依赖属性特点: 依赖属性是属性值存储在一个中央存储库中.而不是实现为类中的普通实例变量. 依赖属性的主要优势在于允许在运行时绑定属性值到实例数据.绑定所产生的属性实际值则是在运行时确定的. 要想 ...

  7. Apache Maven help插件介绍和pom.xml中进行property属性的定义、引用

    目录 1. help插件和目标 2. 使用help:evaluate查看属性值 2.1 查看pom.xml定义的property 2.2 查看系统的属性值 2.3 查看系统的环境变量 2.4 查看pr ...

  8. POJO类中布尔类型属性的定义与命名

    阿里Java开发手册中强制规定: 而不类型的变量名不要使用isXxx的格式.因为布尔类型属性的getter方法与其他类型的不一样,是isSuccess(),如果在变量名之前加上is的话,属性名与方法名 ...

  9. php 定义title,HTML5中对title属性的定义与规定

    注意,这里说的不是title标签( ),而是title属性(如 总结: 元素的title属性的值就是该元素的咨询信息,并有可能适当的以提示框的形式显示出来. title属性是纯文本形式的. 例如:超级 ...

最新文章

  1. FPGA(3)验证数字逻辑(与门、与非门、二选一数据选择器、2-4译码器、半加器、全加器)
  2. matlab图像中心坐标的确定,已知散点图中各点的坐标,如何确定散点图的中心点坐标?Matlab? 爱问知识人...
  3. boost::function_types::is_member_object_pointer的用法测试程序
  4. java的int、char、long、float、double对byte的转换,在通信的时候会用到
  5. CM: 如何通过attachment的physical instance id反查到所属的business object ID
  6. [GraphQL] Create a GraphQL Schema
  7. mysql 修复数据表 批量_MySQL数据库迁移与MySQL数据库批量恢复
  8. TensorFlow工具及笔记
  9. js 自学,云知梦知识 点理论
  10. python怎么看待_如何看待将Python作为少儿编程的基础语言?
  11. warning C4996 sprintf This function or variable may be unsafe
  12. Ubuntu安装Spark
  13. 两招让你成为很厉害的T型人才
  14. 计算机科技兴趣小组活动总结,科技兴趣小组的活动总结
  15. Java之消息推送浅入浅出
  16. 模糊控制器的MATLAB仿真(位置跟踪和 Simulink仿真)
  17. 【istioctl】multicluster mesh 管理源码走读
  18. python安装第三方库方法_Python安装第三方库的4种方法
  19. 计算机教室论文,高校多媒体教室计算机维护措施
  20. python验证身份证真伪_验证身份证的真伪,博客系统、个人博客、PHP、Linux、MySQL、python、前端技术、WEB知识...

热门文章

  1. ubuntu14.04.03 vsftpd
  2. 小白学数据分析-----付费渗透率再研究
  3. PostgreSQL学习手册(七) 事物隔离
  4. 【原创视频教程】学生信息管理系统5--学员成绩管理
  5. Nancy之结合TinyFox调试备忘
  6. 微博 Docker 化混合云平台大剖析
  7. 第2次作业+105032014158
  8. Cer Crt Pem Pfx 证书格式转换
  9. jQuery EasyUI使用教程之使用标记创建树形菜单
  10. 鄙人为啥要在博客上记录学到的技术细节?