2013-03-12 86 views
2

我有一個使用2個DevExpress ListBoxControls的用戶可以將項目從一個移動到另一個的Winform應用程序。左側的框具有「所有可用的」部分,而右側的框具有當前分配給用戶的部分。我對泛型非常陌生,但我試圖在這個項目中實現它們。每個ListBoxControl勢必一個ObservableCollection通過它的數據源:如何排序綁定到ListBoxControl的ObservableCollection <T>?

ObservableCollection<Sections> allSections = new ObservableCollection<Sections>((dbContext.Sections 
        .OrderBy(s => s.SectionName).AsEnumerable<Sections>())); 

listboxAllSections.DataSource = allSections; 
listboxAllSections.DisplayMember = "SectionName"; 
listboxAllSections.ValueMember = "SectionID"; 

所以我有4個按鈕,每個列表框之間,以允許用戶在移動項目來回:

MoveRight的>
MoveAllRight >>
MoveLeft <
MoveAllLeft <<

MoveRightMoveLeft我創造了這個通用功能:

private void MoveItem<T>(ListBoxControl source, ListBoxControl target) 
{ 
    ObservableCollection<T> sourceItems = (ObservableCollection<T>)source.DataSource; 
    ObservableCollection<T> targetItems = (ObservableCollection<T>)target.DataSource; 

    target.BeginUpdate(); 

    //Add items to target. 
    foreach (T item in source.SelectedItems) 
     targetItems.Add(item); 

    //Remove items from source. 
    for (int x = 0; x < source.SelectedItems.Count; x++) 
     sourceItems.Remove((T)source.SelectedItems[x]); 

    target.EndUpdate(); 
} 

所有的偉大工程,但我想補充分揀到它。只有在將項目移動到左側時,我才需要將項目移到右側進行排序。我無法弄清楚如何根據某個屬性對泛型集合進行排序。例如,Sections有一個名爲SectionName的屬性,我想分類。如果我使用的實際類型,我可以做到這一點。

ObservableCollection<Sections> sourceItems = (ObservableCollection<Sections>)listboxAllSections.DataSource; 

var sortedItems = new ObservableCollection<Sections>(); 

foreach (var item in sourceItems.OrderBy(t => t.SectionName)) 
    sortedItems.Add(item); 
listboxAllSections.DataSource = sortedItems; 

但我不知道如何使這個普通到sourceItems.OrderBy(t => t.SectionName)可以是在通過型式領域

任何幫助/指導表示讚賞!

回答

1

你可以這樣做:

private void MoveItem<T>(ListBoxControl source, ListBoxControl target) 
                  where T : IComparable 
{ 
    var sortedItems = new ObservableCollection<T>(); 
    var sordet = sourceItems.OrderBy(t => t); 

} 

如果T知道如何給它反對任何自我比較,你可以調用List<T>.OrderBy(c => c)(< - 僞代碼),你將永遠有一個排序列表。

0

我想你應該嘗試使用CollectionViewSource來排序你的ListBox中的數據。這樣您就不必將數據保存在ObservableCollection中。此外,它將您的代碼隱藏/ ViewModel從演示邏輯中分離出來。 有一個示例顯示如何使用CollectionViewSource on MSDN

相關問題