2009-09-28 152 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

相關問題