目录

介绍

问题与解决方案

使用代码

兴趣点


介绍

我坐在那里试图回忆起我多年来遇到的与WPF相关的编程问题,并且想起了其中一个涉及创建可观察的枚举器值集合的问题。这很早以前就发生在我身上,我无法找到解决问题的代码,但是我确实记得它特定于所涉及的枚举器,实际上是“坏事”(TM)。本文提供了一种可调试的通用方法,并且应该适用于您认为重要的任何枚举器。我不会假装这是解决问题的唯一或最佳方法,但我可以保证它会起作用,并且肯定是可行的(至少在我看来)。话虽这么说,但有两种针对此问题的全XAML解决方案(通过简单的Google搜索即可找到这些方法),

诚然,本文将很短,并且没有屏幕截图或随附的可下载文件,因为所有源代码都将在单个<pre>块中显示,并且可以轻松地复制/粘贴到您自己的项目中。

问题与解决方案

在WPF中,集合应该是可观察的,以便与UI良好协作,但是枚举器不利于这种方式。我的解决方案是编写一个扩展方法和一个独立的静态方法,将给定的枚举数表示为ObservableCollection。事不宜迟(忙乱、工作或延迟,与c# ADO框架相反),下面是代码:

using System;
using System.Collections.ObjectModel;namespace ObjectExtensions
{public class EnumItem{public object Value          { get; set; }public string Name           { get; set; }public Type   EnumType       { get; set; }public Type   UnderlyingType { get; set; }}public static class ExtendEnum{/// <summary>/// Get a list of all items in the enumerator assiated with the one we called <br/>/// this method with. Example: DayOfWeek.Monday.AsObservableEnum will return <br />/// all items in the DayOfWeek enumerator./// </summary>/// <param name="enumObj">An enumerator value, like DayOfWeek.Monday</param>/// <returns>ObservableCollection of items in the parent enumerator</returns>public static ObservableCollection<EnumItem> AsObservableEnum(this Enum enumObj){// get our enumerator type, and call the plain static methodType enumType = enumObj.GetType();return AsObservableEnum(enumType);}/// <summary>/// Get a list of all items in the specified enumarator type./// </summary>/// <param name="enumType">The enumerator type</param>/// <returns>ObservableCollection of items in the specified enumerator, or <br/>/// null is no enumerator was specified</returns>public static ObservableCollection<EnumItem>AsObservableEnum(Type enumType){// set a predictable valueObservableCollection<EnumItem> list = null;// if the specified type is not nukll AND it is actually an enum type, // we can create the collectionif (enumType != null && enumType.IsEnum){// discover the underlying type (int, long, byte, etc)Type underlyingType = Enum.GetUnderlyingType(enumType);// create the listlist = new ObservableCollection<EnumItem>();// get each enum item and add it to the listforeach (Enum item in enumType.GetEnumValues()){list.Add(new EnumItem(){ // the name that will probably be displayed in the UI componentName           = item.ToString(), // the actual enum value (DayofWeek.Monday)Value          = item, // the enum typeEnumType       = enumType,// the underlying type (int, long, byte, etc)UnderlyingType = underlyingType});}}return list;}}
}

使用代码

在标准WPF应用程序中,用法是典型的。由于枚举数不会超出其实际定义而更改其内容,因此以某种方式将生成的可观察枚举集合创建为静态对象(包含在全局静态类中或作为单例对象,甚至是两者的组合)将是一个好主意。一次将其创建为静态对象意味着您将不必花费大量时间来重新分配对象,这将防止堆碎片化并最终节省CPU周期。但是,对于简单的测试,您可以在窗口的代码隐藏区中执行以下操作:

public class MainWindow : Window, INotifyPropertyChanged
{private ObservableCollection<EnumItem> enums;public ObservableCollection<EnumItem> Enums{ get { return this.enums; } set { if (value != this.enums) { this.enums = value; this.NotifyPropertyChanged(); } } }public MainWindow(){this.InitializeComponent();this.DataContext = this;this.Enums = DayOfWeek.Monday.AsObservableEnum();// or //this.Enums = ExtendEnum.AsObservableEnum(typeof(DayOfWeek));}
}

在XAML中,您可能希望使用ListBox来允许选择所显示的枚举数:

<ListBox ItemsSource="{Binding Path=Enums}" Height="120" Width="120" DisplayMemberPath="Name"/>

一旦在用户界面中选择了枚举值,就可以出于任何目的完全访问父枚举类型。

兴趣点

我维护一个仅包含扩展方法的程序集,并且此技术已添加到其中。每个数据类型都有自己的文件,例如,我有称为ExtendXMLToLinq,ExtendString,ExtendIEnumerable等的类/文件。我建议,如果您做了大量的c#编码,那么您应该开始自己的编码。相信我,如果您现在开始这样做,您的编程生活将会更容易。

https://www.codeproject.com/Articles/5295461/WPF-Creating-Observable-Enumerators

WPF——创建可观察的枚举器相关推荐

  1. WPF——专用枚举器ListBox和ComboBox

    目录 介绍 提供了什么 本地定义的枚举器 代码 EnumItemList集合和EnumItem集合项 附加属性 使用代码 结束语 下载控件-141.8 KB 介绍 几天前,我发布了这篇文章,其中描述了 ...

  2. 基础【循环】-----(枚举器)------(转)

    Iterator:枚举器 如果你正在创建一个表现和行为都类似于集合的类,允许类的用户使用foreach语句对集合中的成员进行枚举将会是很方便的.这在C# 2.0中比 C# 1.1更容易实现一些.作为演 ...

  3. C#图解教程 第十八章 枚举器和迭代器

    枚举器和迭代器 枚举器和可枚举类型 第12章中,我们看到可以用foreach语句遍历数组.在本章,我们会进一步探讨数组,来看看为什么它们可以被foreach语句处理.我们还会研究如何使用迭代器为用户自 ...

  4. 黑马程序猿——C#枚举器深入解析

    ------- Java培训.Android培训.iOS培训..Net培训 .期待与您交流!  ------- 废话不说了,上码,如果你可以一眼看穿下面这段代码的执行流程,请您就飘过吧(这段代码摘抄自 ...

  5. Unity 2021创建2D休闲点击器游戏视频教程

    Unity 2021创建2D休闲点击器游戏视频教程 Learn how to create a 2D Idle Clicker Game in Unity 2021 了解如何在Unity 2021中创 ...

  6. foreach遍历进阶_“枚举器“/GetEnumerator()方法

    通过foreach遍历数据,实际上是调用了一个"枚举器"来遍历数据,和foreach没有任何关系,foreach只是语法上的简化而已,或者说foreach语句降低了枚举的复杂度. ...

  7. Java心得--键值、枚举器

    1. 集(Set):和数学上的"集合"概念相对应,是最简单的一种集合. Set集合中不区分元素的顺序,因此也就不记录元素的加入顺序. Set集合中不包含重复元素,即任意的两个元素e ...

  8. ATL中集合和枚举器

    一.实现枚举器 typedef std::vector< std::string > ContainerType; typedef VCUE::GenericCopy<VARIANT ...

  9. labview数据枚举数据服务器,枚举器报告'未指定的错误,不能枚举服务器

    Dear all 实在没办法了.希望大家能帮帮忙! 这两天突然连接不上数据库了.我用的是vb和vb.net,不关代码的事,因为前段时段时间都好好的,这两天在搞.net就突然不行了.怎么查都查不出,我用 ...

最新文章

  1. 博客园 cnblogs博客添加Google Analytics统计
  2. sql2008表结构查看_【赵强老师】Oracle数据库的存储结构
  3. 以上帝模式管理Windows系统
  4. 算法每日学打卡:java语言基础题目打卡(01-10)
  5. 大剑无锋之Redis面试题【推荐】
  6. linux 中网卡配置命令 ifconfig简介
  7. 做微信营销你知道男女用微信的习惯吗?
  8. 【区块链】区块链学习要点记录
  9. 一个计算机高手的成长zz
  10. 公众平台模板消息所在行业_微信公众号模板消息群发工具免费注册试用7天
  11. python发送qq邮件失败_python发送QQ邮件
  12. Java 计算排列_java如何进行排列组合运算
  13. C语言LMS双麦克风消噪算法,基于两个时域LMS算法双麦克风系统分析.doc
  14. js实现开平方 Math.sqrt
  15. 离线部署NFS文件系统
  16. 理解GBASE LDAP认证方法
  17. 作为Gatekeeper,请守好交付质量关口(Quality Gate)
  18. http请求报文 主机IP_计算机网络基础:这是一份详细HTTP学习指南
  19. 电机三角形接法和星形接法的理解
  20. 数据科学家:探索世界的探险家与怀疑一切的大侦探?

热门文章

  1. 写python代码的心得体会_写python代码的一点感想
  2. elk如何同步到es 方案靠谱吗_架构设计:微服务架构如何划分?这6个标准原则让你一目了然...
  3. UI设计插画素材|苹果设备展示
  4. 手机活动促销宣传海报,如何设计更有吸引力?
  5. APP界面的数据可视化设计临摹学习模板
  6. Mac精品软件分享第二期
  7. GCC帧指针的开启与关闭以及反汇编测试
  8. DPDK 跟踪库 CTF格式
  9. Socket IO多路复用: epoll原理图解
  10. 介绍Calico eBPF数据平面:Linux内核网络、安全性和跟踪(Kubernetes、kube-proxy)