将IEnumurable转换为Observable Collection而不创建Observable集合的新实例

时间:2012-02-14 05:38:58

标签: c# wpf

我有一个 Observable Collection ,其中包含我的数据值。我想在该集合中使用 Orderby ,但我得到一些例外 "Cannot convert IEnumurable to ObservableCollection"。是否可以使用 OrderBy 或者为排序集合提供一些选项?

任何人请告诉我解决方法。 提前谢谢。

我的代码是:

get {

     return _availableStocks == null ? null : _availableStocks .OrderBy(z => z.Casepack.CasePackContents);   
     // Here _availableStocks is my collection
     //Here i am not able to use orderby in this collection Its showing error line
     // Here i need to sort the _availableStocks 
    }

我的实际代码是:

   foreach (var cachedStock in AvailableSelectedStocks)
      {

          if (SelectedStock != null)
          {

            AvailableStocks= CollectionViewSource.GetDefaultView(_availableStocks);

            AvailableStocks.SortDescriptions.Add(new SortDescription(SelectedStock.Casepack.CasePackContents.Count.ToString(), ListSortDirection.Ascending));
            //In this above line i am getting the Sort descriptions only i am not getting the datas in the SourceCollection . how can i get values in this Collection

            this.SelectedStocks.Remove(SelectedStock);

            this.RaisePropertyChanged(Member.Of(() => AvailableStocks));

         }
      }

4 个答案:

答案 0 :(得分:2)

.OrderBy扩展名返回一个IEnumerable,这会导致您的问题。尝试对吸气剂进行分类也有点糟糕。

我会考虑用ICollectionView

包装你的observable集合

public ICollectionView Stocks { get; private set; }

private readonly ObservableCollection<Stock> stocks;

构造

  stocks = new ObservableCollection<Stock>();
  Stocks = CollectionViewSource.GetDefaultView(stocks);
  Stocks.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));

其中“名称”是您要排序的类库存的名称

当您添加到可观察集合'stock'时,'Stocks'ICollectionView将会更新,您的视图将按排序顺序显示这些项目。

答案 1 :(得分:0)

你可以尝试

return new ObservableCollection<Stock>(_availableStocks.OrderBy(z=>.Casepack.CasePackContents).ToList());

答案 2 :(得分:0)

如果您的属性类型是Observable集合,您还需要返回一个Observable集合:

if (_availableStocks == null)
{
  return null;
}

var orderredStocks = _availableStocks.OrderBy(z => z.Casepack.CasePackContents);
return new ObservableCollection<T>(orderredStocks);

用您的库存类型替换T.

请注意,每次访问该属性时,都会执行排序,因此最好将此代码移动到执行一次的位置,并将其结果返回给属性。

答案 3 :(得分:-1)

OrderBy()是System.Linq上的Extension方法。

您需要在课程的顶部使用System.Lninq。

使用System.Lninq;

请先确认一下。

您可以通过...

创建Observable Collection的新实例
return new ObservableCollection<SOMETYPE>(_availableStocks.OrderBy(z=>.Casepack.CasePackContents).ToList());