如何处理 类 的 Observable 集合
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;
}
但是当我这样做的时候,我得到了这个错误:
Error CS0266 Cannot implicitly convert type 'System.Linq.IOrderedEnumerable' to 'System.Collections.ObjectModel.ObservableCollection'. An explicit conversion exists (are you missing a cast?)
试试这个:
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 传递给可观察集合的构造函数。
但是,那个returns集合的一个新实例。因此,如果未排序的实例绑定到 GUI,则可能不会更新您的 GUI。支持排序的另一种方法是使用 ICollectionView.
SO 问题 how-do-i-sort-an-observable-collection 可能对您也很有趣。以下扩展方法可用于排序 ObservableCollection
s 而无需重新创建:
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
class 需要实施 IComparable
或者您需要实施自定义 IComparer<TracefieldPartProgramClass>
并将其传递给 Sort 方法。
Enumerable.OrderBy
不是 return 一个 ObservableCollection
,而是一个 IEnumerable<T>
,您可以使用 List<T>
constructor:
创建一个新的
var obcSortedList = obcToSort
.OrderBy(w => w.obcTraceFieldPartProgram[0].Item3.ToString())
.ToList();
var obcSorted = new ObservableCollection<EasyRunBinSerializableData.TracefieldPartProgramClass>(obcSortedList);
如错误所述,您正试图将 IOrderedEnumerable
分配给 ObservableCollection
类型的变量,这是不可能的。
但幸运的是,ObservableCollection
有一个 constructor,它接受一个 IEnumerable
并用 IEnumerable
的项目预先填充它。
因此,为了使该错误消失,请使用:
var sortedEnumerable = obcToSort.OrderBy(w => w.obcTraceFieldPartProgram[0].Item3.ToString());
obcSorted = new ObservableCollection<EasyRunBinSerializableData.TracefieldPartProgramClass>(sortedEnumerable );
我有以下 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;
}
但是当我这样做的时候,我得到了这个错误:
Error CS0266 Cannot implicitly convert type 'System.Linq.IOrderedEnumerable' to 'System.Collections.ObjectModel.ObservableCollection'. An explicit conversion exists (are you missing a cast?)
试试这个:
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 传递给可观察集合的构造函数。
但是,那个returns集合的一个新实例。因此,如果未排序的实例绑定到 GUI,则可能不会更新您的 GUI。支持排序的另一种方法是使用 ICollectionView.
SO 问题 how-do-i-sort-an-observable-collection 可能对您也很有趣。以下扩展方法可用于排序 ObservableCollection
s 而无需重新创建:
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
class 需要实施 IComparable
或者您需要实施自定义 IComparer<TracefieldPartProgramClass>
并将其传递给 Sort 方法。
Enumerable.OrderBy
不是 return 一个 ObservableCollection
,而是一个 IEnumerable<T>
,您可以使用 List<T>
constructor:
var obcSortedList = obcToSort
.OrderBy(w => w.obcTraceFieldPartProgram[0].Item3.ToString())
.ToList();
var obcSorted = new ObservableCollection<EasyRunBinSerializableData.TracefieldPartProgramClass>(obcSortedList);
如错误所述,您正试图将 IOrderedEnumerable
分配给 ObservableCollection
类型的变量,这是不可能的。
但幸运的是,ObservableCollection
有一个 constructor,它接受一个 IEnumerable
并用 IEnumerable
的项目预先填充它。
因此,为了使该错误消失,请使用:
var sortedEnumerable = obcToSort.OrderBy(w => w.obcTraceFieldPartProgram[0].Item3.ToString());
obcSorted = new ObservableCollection<EasyRunBinSerializableData.TracefieldPartProgramClass>(sortedEnumerable );