简介
枚举是一个不同的类型组成的一组命名的常数。一个非常有用的功能时,我们的所有值,一个变量(例如,控制对齐)明确。我们可以使用一个枚举,并为它定义的所有可能值。当我们在代码中使用它,我们已命名的常数,很干净,安全。有时我们需要显示用户的一些枚举类型的变量的值。这很容易做到的,使用toString()函数。但有时,我们有我们没有很好的可用性测试的枚举定义的常量。考虑下面的枚举:public enum AlignmentEnum
{
TopLeft,
TopRight,
TopCenter,
CenterCenter,
BottomRight,
BottomLeft,
BottomCenter
}
当这些常量显示给用户(说的形式,),他们会出现。 TopLeft.ToString()将返回quot; TopLeftquot;等。这些常量看起来很简单,对我们大多数人阅读和理解。但他们一定要找到可用性测试说明。测试仪会告诉你,左上应显示为quot; Leftquot热门;什么用户可能的CenterCenter?!现在,我同意,有时开发者得到一点命名习惯的情感,但他们有他们自己的方式了解他们!因此,如何解决呢?建议的解决方案
这将是美妙的,如果我们可以在某种程度上只是地图这些常量,一些用户友好的名称。只要我们需要显示一个枚举,用户友好的值将显示,每当我们需要使用常量,实际枚举可用。这可能是一个解决方案,可以处理的可用性测试和我的开发商兄弟奇怪的命名习惯。解决方案
{S0}
这是一个简单的解决方案。我们创建了一个自定义属性类,它有几个属性来形容一个枚举恒定。然后,我们用它来装饰我们的枚举描述每一个常量的属性。进入我们的用户友好的名称的枚举常量的映射。创建一个项目源,这些属性的列表,使我们可以使用它在我们的ListBox或任何地方,我们要显示的枚举常量,我们使用从TypeDelegator派生的类。在这里,ObjectDataProvider帮助我们在XAML中创建TypeDelegator类GetCustomAttributes功能需要枚举。解释解决方案
该解决方案是由三部分组成。我们使用自定义属性来描述每一个枚举常量的用户友好的名称(DescriptionAttribute类项目)。{C}
类名为EnumConstant被用来存放我们需要一个用户友好的名称从枚举常量的属性。然后我们有一个描述属性,用户友好的名称问题不断。 DescriptionAttribute是用来枚举的属性为每一个常数。装饰枚举使用DescriptionAttribute将简单。[UserFriendlyEnums.Description(AlignmentEnum.BottomRight, "Bottom of right")]
[UserFriendlyEnums.Description(AlignmentEnum.TopCenter, "Center top")]
[UserFriendlyEnums.Description(AlignmentEnum.BottomCenter, "Center bottom")]
[UserFriendlyEnums.Description(AlignmentEnum.CenterCenter, "Center")]
[UserFriendlyEnums.Description(AlignmentEnum.BottomLeft, "Bottom of left")]
[UserFriendlyEnums.Description(AlignmentEnum.TopLeft, "Top of left")]
[UserFriendlyEnums.Description(AlignmentEnum.TopRight, "Top of right")]
public enum AlignmentEnum
{
TopLeft,
TopRight,
TopCenter,
CenterCenter,
BottomRight,
BottomLeft,
BottomCenter
}
对于每个枚举常量,我们枚举上的属性。
我们使用"TypeDelegator"GetCustomAttributes"功能(在项目XamlableTypeDelegator类)派生一个泛型类。我们创建了一个派生类,因为TypeDelegator不能在XAML中直接使用。/// <span class="code-SummaryComment"><summary>
</span>///<span class="code-comment"> A basic type derived from System.Reflection.TypeDelegator
</span>/// <span class="code-SummaryComment"></summary>
</span>public class XamlableTypeDelegator:System.Reflection.TypeDelegator
{
/// <span class="code-SummaryComment"><summary>
</span> ///<span class="code-comment"> Initializes the type derived from TypeDelegator that can be initialized in Xaml
</span> /// <span class="code-SummaryComment"></summary>
</span> /// <span class="code-SummaryComment"><param name="delegatingType">The type that is the delegating
</span> /// type of the base TypeDelegator<span class="code-SummaryComment"></param>
</span> public XamlableTypeDelegator(Type delegatingType) :
base(delegatingType) { }
}
最后,我们使用ObjectDataProvider创建上述泛型类的一个实例从GetCustomAttributes功能(资源名称"UserFriendlyEnumProvider",实际上是一个ObjectDataProvider对象)创建一个项目源。<ObjectDataProvider MethodName="GetCustomAttributes"
ObjectType="{x:Type this:XamlableTypeDelegator}"
x:Key="UserFriendlyEnumProvider" >
<ObjectDataProvider.ConstructorParameters>
<x:Type TypeName="this:AlignmentEnum"/>
</ObjectDataProvider.ConstructorParameters>
<ObjectDataProvider.MethodParameters>
<sys:Boolean>false</sys:Boolean>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
这是我们的解决方案的最后一步,我们终于准备DescriptionAttribute对象名单,一个一个枚举常量。我们可以使用它作为任何暴露此属性控制项目源。在演示应用中,我们还可以使用CollectionViewSource枚举常量列表进行排序。