Как я могу обновить комбинированный список после изменения его ItemsSource ObservableCollection - PullRequest
7 голосов
/ 27 октября 2011

Проблема проста: при обновлении ItemsSource Combobox не «обновляется», например. новые элементы не добавляются в список элементов в выпадающем списке.

Я пробовал решение от aceepted ответа на этот вопрос: WPF - автоматическое обновление содержимого списка без удачи.

вот мой код, XAML:

<ComboBox Name="LeadTypeComboBox" ItemsSource="{Binding LeadTypeCollection}" />

ViewModel:

public ObservableCollection<XmlNode> LeadTypeCollection { get; set; }

способ обновления этой коллекции заключается в отдельном методе, который загружает данные из обновленного файла XML: this.LeadTypeCollection = GetLeadTypesDataSource();

Я также пытался использовать Add для тестирования:

this.LeadTypeCollection = GetLeadTypesDataSource();
ItemToAdd = LeadTypeCollection[LeadTypeCollection.Count - 1];
this.LeadTypeCollection.Add(ItemToAdd);

коллекция обновлений кода определенно запускается, я вижу новые элементы в этой коллекции при отладке, но я не вижу их в выпадающем списке.

Выполнение этого в кодовом модуле xaml работает: LeadTypeComboBox.ItemsSource = MyViewModel.GetLeadTypesDataSource();, но я бы хотел достичь этого с помощью MVVM, т. Е. Код должен быть в ViewModel, который не знает об элементе управления LeadTypeComboBox.

Ответы [ 3 ]

7 голосов
/ 27 октября 2011

Ответ Firedragons будет работать, но я бы предпочел инициализировать коллекцию LeadTypeCollection только один раз и использовать команду clear, add remove для обновления вашей коллекции.

var update = GetLeadTypesDataSource();     
this.LeadTypeCollection.Clear();

foreach(var item in update)
{
   this.LeadTypeCollection.Add(item);
}

Ваша привязка xaml должна работать, если текст данных правильный

<ComboBox Name="LeadTypeComboBox" ItemsSource="{Binding LeadTypeCollection}" />
5 голосов
/ 27 октября 2011

Я думаю, что видел это раньше, и решение было обновить свойство коллекции, чтобы вызвать изменение.

т.е.как найдено в другом месте в stackoverflow):

public static void Raise(this PropertyChangedEventHandler handler, object sender, string propertyName)
{
    if (null != handler)
    {
        handler(sender, new PropertyChangedEventArgs(propertyName));
    }
}
1 голос
/ 21 марта 2018

Простой метод - заменить ItemsSource пустым списком, а затем изменить его на ваш обновленный источник.Фрагмент из моего проекта, который работает:

        RulesTable.ItemsSource = Rules.rulesEmpty;
        RulesTable.ItemsSource = Rules.Get();
...