繁体   English   中英

我如何排序一个ObservableCollection <T> 那绑定到一个ListBoxControl吗?

[英]How can I sort an ObservableCollection<T> that's bound to a ListBoxControl?

我有一个Winform应用程序,它使用2个DevExpress ListBoxControls,用户可以将项目从一个移动到另一个。 左侧的框具有“所有可用”部分,而右侧的框具有当前分配给用户的内容。 我是泛型新手,但正在尝试在此项目中实现它们。 每个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个按钮,以允许用户来回移动项目:

向右移动>
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)通用,可以是传入的Type的字段。

任何帮助/指导表示赞赏!

您可以这样做:

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) (<-伪代码),并且始终会有一个排序列表。

我猜您应该尝试使用CollectionViewSourceListBox数据进行排序。 这样,您不必将数据保留在ObservableCollection 此外,它会将您的代码隐藏/ ViewModel与表示逻辑分离。 有一个示例显示了如何在MSDN上使用CollectionViewSource

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM