我有一个winform应用程序,它使用2个DevExpress ListBoxControls,用户可以将项目从一个移动到另一个。左侧的框具有“所有可用”部分,而右侧的框具有当前分配给用户的框。我是Generics的新手,但我正在尝试在这个项目中实现它们。每个ListBoxControl都通过它的DataSource绑定到ObservableCollection:
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 <<
对于MoveRight
和MoveLeft
我创建了这个通用函数:
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)
可以是传入的Type的字段。
感谢任何帮助/指导!
答案 0 :(得分: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)
(&lt; - 伪代码),并且您将始终拥有已排序的列表。
答案 1 :(得分:0)
我猜您应该尝试使用CollectionViewSource
对ListBox
中的数据进行排序。这样您就不必将数据保存在ObservableCollection
中。此外,它将您的代码隐藏/ ViewModel与表示逻辑分开。
有一个示例显示如何使用CollectionViewSource on MSDN。