返回首页

简介
枚举是一个不同的类型组成的一组命名的常数。一个非常有用的功能时,我们的所有值,一个变量(例如,控制对齐)明确。我们可以使用一个枚举,并为它定义的所有可能值。当我们在代码中使用它,我们已命名的常数,很干净,安全。有时我们需要显示用户的一些枚举类型的变量的值。这很容易做到的,使用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枚举常量列表进行排序。

回答

评论会员:bhiller 时间:2012/01/26
更好的解决方案,已经公布的
评论会员:bhiller 时间:2012/01/26
看一看:

后来随着全球化,你会从"说明"属性更改为资源
评论会员:。voloda2 时间:2012/01/26
没有什么新的
评论会员:JRiggs 时间:2012/01/26
不有用或有趣的
评论会员:。PIEBALDconsult 时间:2012/01/26
我(以及其他许多人在这里)简单地用一个{A2}]

还可以看到我的{A3}
评论会员:。托里Cuturicu 时间:2012/01/26
目前已经有很多(更好)解决这一问题的文章。你没有做任何新的东西在这里。修订于8月10日,2010下午03:21