2015-01-14 2 views
0

У меня проблема с данными упорядочения для ListView. У меня есть EventDisplay класс, который является ObservableCollection для ListView (так называемые события)Заказ ObservableCollection для ListView

private ObservableCollection<EventDisplay> currentEvents = new ObservableCollection<EventDisplay>(); 

private void Events_Loaded(object sender, RoutedEventArgs e) 
{ 
    sv = (ScrollViewer)VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(this.Events, 0), 0); 

    Events.ItemsSource = currentEvents;    
} 

Я затем добавить новые данные по функции:

private void LoadDataToList(List<EventDisplay> newItems) 
{ 
     foreach (EventDisplay ed in newItems) 
     { 
      //Set some additional data 
      currentEvents.Add(ed); 
     } 
     //When this line below is commented ListView data is updated 
     //but is not sorted, when i uncomment the listview data is not being updated 

     //currentEvents = new ObservableCollection<EventDisplay>(currentEvents.OrderByDescending(x => x.ed.date).ToList());     
    } 

Так что правильный способ упорядочения данных для ListView в ОС Windows 8.1 Программы ?

ответ

1

Вы можете сортировать & фильтр вид вашего ObservableCollection (объяснение here)

public class ViewableCollection<T> : ObservableCollection<T> 
    { 
     private ListCollectionView _View; 
     public ListCollectionView View 
     { 
      get 
      { 
       if (_View == null) 
       { 
        _View = new ListCollectionView(this); 
       } 
       return _View; 
      } 
     } 
    } 

структуры данных для примера:

interface ICustomer 
{ 
    string CuctomerName{get;set;} 
    int Age{get;set;} 
} 

Пример использования кода:

ViewableCollection<ICustomer> vCustomers = new ViewableCollection<ICustomer>(); 
// Sorting settings: 
ViewableCollection<ICustomer> vCustomers.View.SortDescriptions.Add(new SortDescription("CustomerName", ListSortDirection.Ascending)); 
vCustomers.View.Filter = MyCustomFilterMethod; 
// add data to collection 
MyCustomers.ToList().ForEach(customer => vCustomers.Add(customer)); 

Метод фильтра для исследования:

private bool MyCustomFilterMethod(object item) 
{ 
    ICustomer customer = item as ICustomer; 
    return customer.Age > 25; 
} 

, когда вам необходимо обновить фильтр, единственное, что вам нужно сделать, это вызов:

this.vCustomers.View.Refresh(); 

Затем вы свяжете свой графический интерфейс vCustomers.View Вам не нужно сбросить обязательные источники и т.д. .

1

Вы должны сделать следующее:

currentEvents = new ObservableCollection<EventDisplay>(currentEvents.OrderByDescending(x => x.ed.date).ToList()); 
Events.ItemsSource = currentEvents; 

Это заставляет ListView пересвязать к новому отсортированного наблюдаемой коллекции.

Другим вариантом является сортировка коллекции Observable на месте. Тем не менее, это может вызвать мерцание, поскольку ListView будет постоянно обновляться по мере продвижения сортировки.

Если вы не хотите, чтобы ScrollView сбросил свою позицию, вы можете сохранить позицию прокрутки, а затем восстановить ее после сортировки списка. У меня был успех с реализацией пользовательского ObservableCollection, который поддерживает сортировку, но предотвращает мигание пользовательского интерфейса, приостанавливая уведомление об изменении во время сортировки и затем выдавая уведомление об обновлении. ScrollView должен оставаться в своем текущем положении даже при столкновении с событием сброса.

+0

Я пробовал это решение, к сожалению, это заставляет ScrollView переходить в начало каждый раз при изменении элементов списка listview. –

+1

Решение может стать немного более привлекательным. Я добавил несколько вариантов выше. – TiMoch

1

Используйте это для добавления кода пунктов:

foreach (EventDisplay ed in newItems.OrderByDescending(x => x.ed.date).ToList() 
    { 
     //Set some additional data 
     currentEvents.Add(ed); 
    } 

Причина Ваш не работает, что вы переназначен на currentEvents ссылку, а не обновление ObservableCollection.