Почему привязка Combobox не работает со списком <T> - PullRequest
0 голосов
/ 20 октября 2011

Я пытаюсь связать комбинированный список в WPF следующим образом,

<ComboBox Width="350" Margin="5" IsEditable="True" ItemsSource="{Binding ComboboxItems}" DisplayMemberPath="Name">

public List<ExpandoObject> ComboboxItems
{
    get
    {
        return comboboxItems;
    }
}

Если я установлю список таким образом в моей модели просмотра,

comboboxItems.Clear();

foreach (ExpandoObject comboboxItem in repository.LoadComboboxItems())
{
    comboboxItems.Add(comboboxItem);
}

NotifyPropertyChanged(this, x => x.ComboboxItems);

Кажется, что NotifyPropertyChanged работает, потому что достигнута точка останова в ComboboxItems, но тогда список комбинированного списка не обновляется в GUI. Snoop не показывает ошибок привязки или чего-либо подобного.

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

UPDATE:

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

public string Database
{
    get
    {
        return importData.Database;
    }
    set
    {
        importData.Database = value;
        NotifyPropertyChanged(this, x => x.Database);

        comboboxItems.Clear();

        foreach (ExpandoObject comboboxItem in repository.LoadComboboxItems())
        {
            comboboxItems.Add(comboboxItem);
        }

        NotifyPropertyChanged(this, x => x.ComboboxItems);
   }
}

Этот сеттер запускается в фоновом потоке? Я спрашиваю, почему установщик заблокирует графический интерфейс, если загрузка элементов из базы данных займет некоторое время?

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

Ответы [ 2 ]

4 голосов
/ 20 октября 2011

Я думаю, что это будет работать, если вы используете ObservableCollection <> вместо List <>.Если вы не используете ObservableCollection, xaml не будет знать, что содержимое списка изменилось.

Чтобы ответить на вторую часть вашего вопроса, если вы попытаетесь установить ObservableCollection с помощью BackgroundWorker напрямую, вы получитеисключение.Один из способов обойти это исключение - установить ObservableCollection с помощью BeginInvoke

. Обратите внимание: вам не нужно вызывать NotifyPropertyChanged(this, x => x.ComboboxItems); в своем установщике.Это потому, что свойство не меняется;свойство является коллекцией, а коллекция содержимое изменяется.ObservableCollection уведомит подписчиков об изменении содержания.

0 голосов
/ 20 октября 2011

Используйте ObservableCollection вместо списка.

Цитирование MSDN:

Вы можете перечислить любую коллекцию, которая реализует интерфейс IEnumerable.Однако для настройки динамических привязок, чтобы вставки или удаления в коллекции автоматически обновляли пользовательский интерфейс, коллекция должна реализовывать интерфейс INotifyCollectionChanged.Этот интерфейс предоставляет событие CollectionChanged, событие, которое должно вызываться при каждом изменении базовой коллекции.

WPF предоставляет класс ObservableCollection, который является встроенной реализацией сбора данных, который реализует интерфейс INotifyCollectionChanged.

Прежде чем реализовать собственную коллекцию, рассмотрите возможность использования ObservableCollection или одного из существующих классов коллекций, таких как List, Collection и BindingList, среди многих других.Если у вас есть продвинутый сценарий и вы хотите реализовать свою собственную коллекцию, рассмотрите возможность использования IList, который предоставляет не универсальную коллекцию объектов, к которой индексируется индивидуальный доступ.Реализация IList обеспечивает наилучшую производительность с механизмом привязки данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...