2015-08-28 2 views
2

Можно ли преобразовать IEnumerable в пользовательский класс, который по-прежнему принадлежит классу ObservableCollection?Бросок IEnumerable в пользовательский класс ObservableCollection?

Причина: я хочу выбрать только отфильтрованный набор элементов на , получить. Я хочу реализовать его на , чтобы получить, потому что многие другие свойства ссылаются на CustomItems и выполняют процессы над элементами, но я хочу как-то заставить его фильтровать набор элементов в зависимости от того, включено ли значение или нет.

Ниже код, чтобы помочь объяснить, что я хочу добиться:

public class CustomItemsCollection : ObservableCollection<ItemViewModel> 
{ 
    public ListView ListView { get; set; } 
    public void ScrollToItem(object item = null) 
    { 
     //Some custom Code 
    } 
} 

А вот моя собственность, что я хочу, чтобы настроить:

private CustomItemsCollection _CustomItems = null; 
    [JsonProperty] 
    public CustomItemsCollection CustomItems 
    { 
     get 
     { 
      if (_CustomItems != null) 
      { 
       if(SomeValueIsEnabled) 
       { 
        var filteredItems = _CustomItems.Where(c => c.Property.equals(SomeValue)); 
        var castedItems = (CustomItemsCollection)filteredItems; 
        return castedItems; 
       } 
       return _CustomItems; 
      } 

      _CustomItems = new CustomItemsCollection(); 
      _CustomItemsChangedSource = new CollectionChangedWeakEventSource(); 
      _CustomItemsChangedSource.SetEventSource(_CustomItems); 
      _CustomItemsChangedSource.CollectionChanged += _CustomItemsChangedSource_CollectionChanged; 
      return _CustomItems; 
     } 
     set { _CustomItems = value; RaisePropertyChanged("CustomItems"); } 
    } 

В частности, эта часть:

if(SomeValueIsEnabled) 
{ 
    var filteredItems = _CustomItems.Where(c => c.Property.equals(SomeValue)); 
    var castedItems = (CustomItemsCollection)filteredItems; 
    return castedItems; 
} 

Возможно ли это или, может быть, неправильно? Какова наилучшая практика?

Спасибо!

ответ

1

Вы не можете просто бросить , но вы можете создать экземпляр CustomItemsCollection и инициализировать его с filteredItems.

Добавьте конструктор пользовательского класса, который проходит через к appropriate ObservableCollection constructor:

public class CustomItemsCollection : ObservableCollection<ItemViewModel> 
{ 
    public CustomItemsCollection(IEnumerable<ItemViewModel> items) 
     : base(items) { } 

    // your other code here 
} 

Тогда вы можете сделать это:

var filteredItems = _CustomItems.Where(c => c.Property.equals(SomeValue)); 
var collection = new CustomItemsCollection(filteredItems); 
return collection; 
+0

Работали в совершенстве! Существуют ли возможные утечки памяти при создании нового CustomItemsCollection каждый раз, когда запрашиваются пользовательские элементы? – Water

+1

Нет, утечки не должно быть. GC будет очищаться, как обычно. – Blorgbeard

0

Попробуйте с этим кодом:

var filteredItems = _CustomItems.Where(c => c.Property.equals(SomeValue)) 
.Select(pre=> new ItemViewModel(){ 
//add info here 
}); 
var castedItems = new CustomItemsCollection(filteredItems); 
+0

Спасибо. Я попробовал, хотя это показало ошибку для меня в .Select. – Water

Смежные вопросы