2011-12-22 4 views
1

У меня есть приложение WPF, которое имеет выпадающий список с элементами поиска. В поле со списком заполнено свойство ObservableCollection, которое создано в моей модели ViewModel.Как обновить combobox после добавления элемента

Пользователь может открыть окно для ввода нового значения поиска. После ввода пользователем нового значения я записываю значение в таблицу поиска в SQL Server. Эта часть работает хорошо.

Проблема в том, что я хочу, чтобы список combobox обновлялся и сортировался правильно. Каков наилучший способ сделать это?

Если я это сделаю, myLookupProperty.Add (newitem), мой combobox обновляется, но это не в правильном порядке.

Если я это сделаю, myLookupProperty = новый ObservableCollection (Context.GetLookupTypes()), то combobox не будет обновляться, пока я не выберу комбобокс, а затем вернусь к нему.

Каков наилучший способ получить новые введенные элементы в таблицу и получить combobox эти изменения и правильно ли они отсортированы?

ответ

1

Вы можете сделать

var sortedItems = myLookupProperty.Items.OrderBy(x => x.WhateverPropertyYouWantToSortOn); 
myLookupProperty.Clear(); 
foreach (var item in sortedItems) { 
    myLookupProperty.Add(item); 
} 

И это будет работать для вас. Причина, по которой первый метод, который вы пробовали, не сработала (как я полагаю, вы догадались) заключается в том, что он просто добавляет новый элемент в нижнюю часть. Причина, по которой второй предложенный вами метод не помогла, заключается в том, что вы нарушаете привязку при замене экземпляра ObservableCollection, к которому привязался ваш пользовательский интерфейс. Он не будет правильно сообщать, что содержимое будет изменено после этого!

В качестве примечания, оказывается, что this exact question was asked here!

+0

Правильно ли используются? Не будет. Очистить(), как очистить все элементы в myLookupProperty, и вам нечего сортировать. – Paparazzi

+0

@BalamBalam - это цель захвата элементов и хранения их в переменной sortedItems (и их сортировке в ходе этого процесса). Таким образом вы можете повторно вставить их в ObservableCollection. В моем первоначальном ответе я набрал это слишком быстро и отменил порядок, который, вероятно, почему вы считаете его запутанным, но я исправил это! – Kevek

1

Вы можете вставить в определенный индекс.

public void Insert (int index, T item) 

Я подозреваю, что при запуске, когда вы строите из SQL ВЫБРАТЬ заявление и порядке, так что будет построен в правильном порядке.

Вы также можете использовать CollectionViewSource для сортировки, но я думаю, что было бы проще вставить соответствующий индекс.

+0

Это повторное внедрение колеса. Для этого вам в основном нужно реализовать сортировку вставки, чтобы вы могли правильно вставить новое значение в соответствующий индекс. Кроме того, это также будет означать, что везде, где исходный диапазон значений исходит, необходимо предварительно отсортировать. – Kevek

+0

@Kevek Вставьте одну строку в нужное положение на LOT меньше накладных расходов, чем копировать, очищать и воссоздавать всю коллекцию, которую вы предлагаете, с таким же количеством кода. Из описания проблемы ясно, что свойства начинают сортироваться. Что касается изобретательности колеса, CollectionViewSource обеспечивает сортировку по XAML или коду (без накладных расходов на копирование, очистку и повторное создание). – Paparazzi

+0

вы не ошибаетесь, но вот моя единственная проблема: если OP не нашел ответа на этот вопрос, который предоставляется во многих других потоках StackOverflow при их первоначальном поиске решения, считаете ли вы, что они должны добавлять пользовательскую вставку сортировать код, чтобы сделать то, что вы предлагаете? Ваша точка зрения на CollectionViewSource прекрасна, и я бы это сделал. – Kevek

2

A CollectionView с описанием сортировки по умолчанию должно работать в вашем случае. Они отлично работают с ObservableCollection, когда имеет место Add \ Remove \ Update (из-за INotifyPropertyChanged).

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