2012-05-16 4 views
0

Новое на WPF, а также на ObservableCollection Мне нужно отсортировать его по-своему и держать его отсортированным каждый раз, когда что-то добавляет или удаляет его.Сортировка ObservableCollection с использованием пользовательской логики

ObservableCollection<User> users = new ObservableCollection<User>(); 

Пользовательский объект следующим образом:

class User 
{ 
    public string Name { get; set; } 
    public bool IsOp { get; set; } 
    public bool IsAway { get; set; } 
} 

Я хотел бы все IsOp's в верхней части списка, в алфавитном порядке. Затем следуют все неоперации в алфавитном порядке.

Каков правильный способ достижения этого?

Большое спасибо заранее.

+0

Посмотрите на Continuous LINQ. –

ответ

1

Самый простой способ заключается в использовании CollectionView:

ICollectionView view = CollectionViewSource.GetDefaultView(users); 
view.SortDescriptions.Add(new SortDescription("IsOp", ListSortDirection.Descending)); 
view.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending)); 

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

Используя трюк, показанный here, вы можете даже использовать Linq:

var query = 
    from u in users.ShapeView() 
    orderby u.IsOp descending, u.Name ascending 
    select u; 

query.Apply(); 
+0

Но теперь мой список в WPF не обновляется автоматически, потому что это не наблюдаемый коллектив? – sprocket12

+0

Да, если вы привяжете ItemSource ListBox к ObservableCollection (вам не нужно связываться с 'query', это всего лишь трюк, чтобы указать порядок сортировки с использованием Linq) –

+0

Thomas, так что если Im понимает правильно ваше высказывание, что я делаю это выше, и он будет постоянно изменять внутреннюю работу моей наблюдаемой коллекции, поэтому не нужно менять какие-либо привязки, все будет сортироваться всякий раз, когда это изменится? – sprocket12

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