2009-09-28 151 views
1

在绑定到Enum的GridView中对列进行排序时,按照Enum的顺序排序。我需要它通过Enum的字符串表示进行排序。以下是我见过的选项,其中我都不喜欢。GridView - 按字母顺序对枚举进行排序

  1. 重新排列枚举按字母顺序排列 - 糟糕的,因为现在的表现是依靠业务和数据访问层“之类的预”的数据。
  2. 使用myEnum.ToString()创建一个新对象(datatable,new list,whatever)并将其绑定到GridView - 这个不错,但我宁愿不要。
  3. 在我的搜索,检查列排序是否是一个枚举,然后按字段的字符串表示排序 - 我必须说,为什么这是不好的?

2号会是我最喜欢的,但就像我说的,我不喜欢它。

更多信息,以防万一 - 我绑定一个列表的任何网格,2列是需要按字符串排序的枚举。网格中还有需要排序的guid类型,字符串和小数点列。

回答

2

尝试使用ViewModels。基本上你可以创建包含你的模型对象的ViewModel对象(你的模型)。这个ViewModel公开了在你的View中使用的新属性和方法。在你的情况下,你会暴露一个属性与您的枚举的字符串表示。好处是,你可以做任何你想要的转换逻辑。

请参阅MVVM模式。 http://en.wikipedia.org/wiki/Model_View_ViewModel

编辑:小例子:

public class WhateverViewModel 
{ 
    public WhateverViewModel(IWhatever model) 
    { 
     this.model = model; 
    } 
    ... 
    public string MyEnumView 
    { 
     get 
     { 
      return model.MyEnum.ToString(); 
     } 
    } 
    public string MyEnumView2 
    { 
     get 
     { 
      switch(model.MyEnum) 
      { 
       case MyEnumType.A: return "Hello"; 
       case MyEnumType.B: return "World"; 
      } 
     } 
    } 
} 
0

这听起来像你想为某列的SortExpression这将使默认排序过程理解你的意图通过一个字符串表示要订购您的数据源对象枚举这是不可能的。 SortExpression只识别要排序的属性,而不是数据类型本身的排序方式。

如果枚举的值无关紧要,您可以指定您想要的订单的值,而无需对它们重新排序,但它本质上是相同的。如果这些值确实重要,那么显然可以将其从窗口中移出。我不喜欢这个想法或者在代码中明确地重新组织值,也不喜欢指定值,因为它最终会成为一个噩梦来维护。我认为有可能将属性应用于枚举值,这将反映在排序中,但事实证明这是不可能的。

由于您的目标是更改枚举的排序方式,您可以选择选项2或选项3.如果排序算法包含在数据中,则没有看到选项3的问题源自己。实际上,它是LINQ的一个相当简洁的实现。但是,如果您决定使用方法2,则仍然可以使用默认排序实现,并且这可能对某些人更具吸引力。

+1

这些值并不重要,但就像我在我的问题中所说的那样,这是一个关注点分离的问题。 Enum驻留在业务层,业务层不关心如何排序,只有表示层关心。 – Martin 2009-09-28 17:52:08

+0

至于你使用#3的建议,它会删除动态排序的所有方面,而我基本上还是手动排序(如果此列以这种方式排序,如果此列排序...),那绝对不是我想要的。我其实也是和#2一起去的......但是这是合理的,因为我也需要它来满足其他原因。 – Martin 2009-09-28 17:54:15

+0

我同意你关于分离问题的观点,我只是在调查尽可能多的选项,因为我可以想到给你带来神奇的SortExpression。我不认为#3会删除动态排序,而不是依靠GridView排序例程的预先存在的机制,而是实现自己的排序例程。然而,这种排序对于GridView仍然是动态的,因为它仍然只是传播哪些公共属性,它会喜欢它的数据排序。 – 2009-09-28 18:20:50

相关问题