2012-02-14 107 views
0

我有一个Observable Collection其中包含我的数据值。我想在该收藏中使用Orderby,但我收到一些例外,如 "Cannot convert IEnumurable to ObservableCollection"。有没有可能使用OrderBy或给我一些选择排序收藏将IEnumurable转换为Observable Collection而不创建Observable collection的新实例

任何人都请告诉我这个的解决方案。 在此先感谢。

我的代码是:

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)); 

     } 
     } 
+0

异常或编译器错误?你能说明这个财产是如何被使用的吗? – 2012-02-14 05:40:28

+0

其编译错误 – SuryaKavitha 2012-02-14 05:47:49

回答

2

.OrderBy扩展返回一个IEnumerable,它会导致您的问题。试图在吸气剂中排序也有些不好。

我会去了解一下与ICollectionView包裹你的观察集合

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)); 

其中 '名称' 是该类股票的物业的名你想排序。

当您添加到可观察集合的“股票”时,“股票”ICollectionView将被更新,并且您的视图将按排序顺序显示这些项目。

+0

谢谢你的漂亮的code.I尝试你的代码一切都很好,但我对这一行有一个疑问“Stocks.SortDescriptions .Add(new SortDescription(“Name”,ListSortDirection.Ascending));“在这一行中,SortDescription()只接受字符串值来排序元素它不接受我的类值。 – SuryaKavitha 2012-02-14 08:14:17

+0

您可以指定属性的名称,例如,如果您有一个具有属性“名称”和“代码”的类,并且您想按“名称”属性进行排序,则为SortDescription指定“名称”。然后这将按照您指定的方向按照该属性对数据进行排序。 – wdavo 2012-02-14 09:51:53

+0

您能否让我知道我要在您的代码中添加我的_availableStocks – SuryaKavitha 2012-02-14 10:45:20

-1

的OrderBy()是在System.Linq的扩展方法。

您需要在您的课堂上使用System.Lninq。

Put

using System.Lninq;

请首先确认。

您可以通过创建观察集合的新实例...

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

我想将IEnumurable转换为Observable集合而不创建新实例oo Observable集合 – SuryaKavitha 2012-02-14 10:32:20

0

你可以尝试

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

当我使用相同的格式时,我正在收集空集合 – SuryaKavitha 2012-02-14 05:49:47

+0

is _availableStocks empty? – SynXsiS 2012-02-14 05:52:56

+0

是的! _availableStocks count = 0 – SuryaKavitha 2012-02-14 06:03:06

0

如果你的属性类型是可观察集合,你需要返回一个可观测收集太:

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

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

替换T与您的股票类型。

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

+0

我想将IEnumurable转换为Observable Collection而不创建新实例oo Observable collection – SuryaKavitha 2012-02-14 10:31:57

+0

@SuryaKavitha您不能,linq调用返回一个IEnumerable是不是一个ObservableCollection – 2012-02-14 10:33:31

+0

当我创建一个新的实例observable集合,我的集合和新集合都将为空 – SuryaKavitha 2012-02-14 10:37:17

相关问题