【问题标题】:How can I sort an ObservableCollection<T> that's bound to a ListBoxControl?如何对绑定到 ListBoxControl 的 ObservableCollection<T> 进行排序?
【发布时间】:2013-03-12 12:30:14
【问题描述】:

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

右移&gt;
MoveAllRight &gt;&gt;
向左移动&lt;
MoveAllLeft&lt;&lt;

对于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 =&gt; t.SectionName) 可以成为传入的 Type 的字段。

感谢任何帮助/指导!

【问题讨论】:

    标签: c# devexpress observablecollection


    【解决方案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&lt;T&gt;.OrderBy(c =&gt; c)(

    【讨论】:

      【解决方案2】:

      我猜你应该尝试使用CollectionViewSourceListBox 中的数据进行排序。这样您就不必在ObservableCollection 中保持数据排序。此外,它将您的代码隐藏/ ViewModel 与表示逻辑分开。 有一个例子展示了如何使用CollectionViewSource on MSDN

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-30
        • 2018-05-18
        • 1970-01-01
        • 2011-08-19
        相关资源
        最近更新 更多