WPF: список привязки к ListBox - PullRequest
11 голосов
/ 19 мая 2011

У меня есть класс:

public class A : INotifyPropertyChanged
{
    public List<B> bList { get; set; } 

    public void AddB(B b)
    {
        bList.Add(b);
        NotifyPropertyChanged("bList");
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }
}

И привязка (DataContext из UserControl является экземпляром A):

<ListBox ItemsSource="{Binding Path=bList}" />

Элементы отображаются, ListBox не обновляется посленовый объект добавлен в список

После изменения списка на ObservableCollection и удаления обработчика NotifyPropertyChanged все работает.

Почему список не работает?

Ответы [ 5 ]

16 голосов
/ 19 мая 2011

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


EDIT:

После изменения списка на ObservableCollection и удаления обработчика NotifyPropertyChanged все работает.

Именно поэтому класс ObservableCollection<T> был представлен ... ObservableCollection<T> реализует INotifyCollectionChanged, что позволяет ему уведомлять пользовательский интерфейс при добавлении / удалении / замене элемента. List<T> не вызывает никаких уведомлений, поэтому пользовательский интерфейс не может определить, когда содержимое списка изменилось.

Тот факт, что вы вызываете событие PropertyChanged, обновляет привязку, но затем он осознает, что это тот же экземпляр List<T>, что и раньше, поэтому он использует тот же ICollectionView, что и ItemsSource, и содержимое ListBox не обновляется.

0 голосов
/ 19 мая 2011

сигнализируя

NotifyPropertyChanged("bList");

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

Если вы измените тип на ObservableCollection, коллекции автоматически отправят

CollectionChanged

уведомления о том, что коллекция предметов изменилась, что вам и нужно.

0 голосов
/ 19 мая 2011

ObservableCollections отправлять CollectionChanged события, а не PropertyChanged события

0 голосов
/ 19 мая 2011

Я думаю, что проблема в том, что, хотя вы уведомляете обязательную структуру об изменении свойства, фактическое значение свойства остается тем же.То есть, хотя список может переоценить значение его привязки ItemsSource, он обнаружит, что это все тот же экземпляр объекта , что и ранее.Например, представьте, что список реагирует на событие измененного свойства, похожее на приведенное ниже.

private void OnItemsSourceBindingChanged()
{
    var newValue = this.EvaluateItemsSourceBinding();
    if (newValue != this.ItemsSource) //it will be equal, as its still the same list
    {
        this.AddNewItems();
    }
}

В вашем примере это будет означать, что он не будет переоценивать элементы.

Примечание: я не знаю , как работает список со свойством ItemsSource - я просто размышляю!

0 голосов
/ 19 мая 2011

Первая мысль, что вы пытаетесь привязать частного участника.Это, конечно, не кажется правильным.

...