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

简介: 列表内容属性 如上图,是一个列表标题排序控件,我们需要定义一个标题列表,从而让调用方可以自由的设置标题信息。 在自定义控件时,会遇到列表依赖属性,那么该如何定义呢? 下面是错误的定义方式: 1 /// 2 /// 标识 的依赖项属性。

列表内容属性

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

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

下面是错误的定义方式:

 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     }

 调用:

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
目录
相关文章
|
3月前
|
XML 开发框架 .NET
|
10月前
|
缓存 C# 虚拟化
WPF列表性能提高技术
WPF数据绑定系统不仅需要绑定功能,还需要能够处理大量数据而不会降低显示速度和消耗大量内存,WPF提供了相关的控件以提高性能,所有继承自`ItemsControl`的控件都支持该技术。
|
19天前
|
开发框架 缓存 前端开发
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(11) -- 下拉列表的数据绑定以及自定义系统字典列表控件
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(11) -- 下拉列表的数据绑定以及自定义系统字典列表控件
47 15
|
19天前
|
开发框架 前端开发 JavaScript
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(5) -- 树列表TreeView的使用
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(5) -- 树列表TreeView的使用
|
19天前
|
存储 设计模式 开发框架
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(7) -- 图标列表展示和选择处理
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(7) -- 图标列表展示和选择处理
|
18天前
|
开发框架 前端开发 JavaScript
在WPF应用中使用GongSolutions.WPF.DragDrop实现列表集合控件的拖动处理
在WPF应用中使用GongSolutions.WPF.DragDrop实现列表集合控件的拖动处理
|
10月前
|
IDE C# 开发工具
2000条你应知的WPF小姿势 基础篇<40-44 启动关闭,Xaml,逻辑树>
2000条你应知的WPF小姿势 基础篇<40-44 启动关闭,Xaml,逻辑树>
43 0
|
12月前
|
C#
WPF技术之Xaml Window
WPF Window 是一个 WPF 窗口类,它具有许多属性枚举可以控制窗口的外观和行为。
109 0
WPF技术之Xaml Window
|
10月前
|
C#
2000条你应知的WPF小姿势 基础篇<57-62 依赖属性进阶>
2000条你应知的WPF小姿势 基础篇<57-62 依赖属性进阶>
35 0
|
10月前
|
存储 开发框架 .NET
2000条你应知的WPF小姿势 基础篇<51-56 依赖属性>
2000条你应知的WPF小姿势 基础篇<51-56 依赖属性>
35 0