繁体   English   中英

如何处理可观察的类集合

[英]How to cope with an Observable collection of classes

我有以下TracefieldPartProgramClass

public class TracefieldPartProgramClass
{
    public TracefieldPartProgramClass() { }
    public ObservableCollection<Tuple<string, object, object>> obcTraceFieldPartProgram = new ObservableCollection<Tuple<string, object, object>>();
}

我用它来进行以下收集:

ObservableCollection<EasyRunBinSerializableData.TracefieldPartProgramClass>();

现在,在填满它之后,我希望能够根据需要进行排序(例如在Tracefield [0]上)。 所以我实现了这个:

private ObservableCollection<EasyRunBinSerializableData.TracefieldPartProgramClass> SortOnTracefield(ObservableCollection<EasyRunBinSerializableData.TracefieldPartProgramClass> obcToSort)
{
var obcSorted = new ObservableCollection<EasyRunBinSerializableData.TracefieldPartProgramClass>();
obcSorted = obcToSort.OrderBy(w => w.obcTraceFieldPartProgram[0].Item3.ToString());<--- this is where I get the error
return obcSorted;

}

但是当我这样做的时候,我得到了这个错误:

错误CS0266无法将类型'System.Linq.IOrderedEnumerable'隐式转换为'System.Collections.ObjectModel.ObservableCollection'。 存在显式转换(您是否缺少演员表?)

试试这个:

private ObservableCollection<EasyRunBinSerializableData.TracefieldPartProgramClass> SortOnTracefield(ObservableCollection<EasyRunBinSerializableData.TracefieldPartProgramClass> obcToSort)
{
    var sorted = obcToSort.OrderBy(w => w.obcTraceFieldPartProgram[0].Item3.ToString();
    return new ObservableCollection<EasyRunBinSerializableData.TracefieldPartProgramClass>(sorted);
}

您可以将IEnumerable传递给可观察的集合的构造函数。


但是,这将返回该集合的新实例。 因此,如果未排序的实例绑定到GUI,则可能不会更新您的GUI。 支持排序的另一种方法是使用ICollectionView


SO问题“ 如何对一个可观察的集合进行排序”也可能对您很感兴趣。 以下扩展方法可用于对ObservableCollection进行排序,而无需重新创建:

static class Extensions
{
    public static void Sort<T>(this ObservableCollection<T> collection) where T : IComparable
    {
        List<T> sorted = collection.OrderBy(x => x).ToList();
        for (int i = 0; i < sorted.Count(); i++)
            collection.Move(collection.IndexOf(sorted[i]), i);
    }
}

但是,您的TracefieldPartProgramClass类需要实现IComparable或者需要实现自定义IComparer<TracefieldPartProgramClass>并将其传递给Sort方法。

Enumerable.OrderBy不返回ObservableCollection而是IEnumerable<T> ,您可以使用List<T>构造函数创建一个新的:

var obcSortedList = obcToSort
    .OrderBy(w => w.obcTraceFieldPartProgram[0].Item3.ToString())
    .ToList();  
var obcSorted = new ObservableCollection<EasyRunBinSerializableData.TracefieldPartProgramClass>(obcSortedList);

如错误所示,您试图将IOrderedEnumerable分配给ObservableCollection类型的变量,这是不可能的。

但幸运的是, ObservableCollection有一个构造函数 ,该构造函数接受IEnumerable并用IEnumerable的项目预填充它。

因此,为了使该错误消失,请使用:

var sortedEnumerable = obcToSort.OrderBy(w => w.obcTraceFieldPartProgram[0].Item3.ToString());
obcSorted = new ObservableCollection<EasyRunBinSerializableData.TracefieldPartProgramClass>(sortedEnumerable );

暂无
暂无

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

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