List‹string› событие INotifyPropertyChanged

У меня есть простой класс со строковым свойством и свойством List, и у меня реализовано событие INofityPropertyChanged, но когда я делаю .Add в список строк, это событие не попадает, поэтому мой конвертер для отображения в ListView не попадает. Я предполагаю, что измененное свойство не попало для добавления в список .... как я могу реализовать это таким образом, чтобы это событие измененного свойства попало???

Мне нужно использовать какой-то другой тип коллекции?!

Спасибо за любую помощь!

namespace SVNQuickOpen.Configuration
{
    public class DatabaseRecord : INotifyPropertyChanged 
    {
        public DatabaseRecord()
        {
            IncludeFolders = new List<string>();
        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        protected void Notify(string propName)
        {
            if (this.PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propName));
            }
        }
        #endregion

        private string _name;

        public string Name
        {
            get { return _name; }

            set
            {
                this._name = value;
                Notify("Name");
            }
        }

        private List<string> _includeFolders;

        public List<string> IncludeFolders
        {
            get { return _includeFolders; }

            set
            {
                this._includeFolders = value;
                Notify("IncludeFolders");
            }
        }
    }
}

person theDoke    schedule 12.12.2011    source источник


Ответы (4)


Вы должны использовать ObservableCollection<string> вместо List<string>, потому что в отличие от List, ObservableCollection будет уведомлять иждивенцев, когда его содержимое будет изменено.

И в вашем случае я бы сделал _includeFolders только для чтения - вы всегда можете работать с одним экземпляром коллекции.

public class DatabaseRecord : INotifyPropertyChanged 
{
    private readonly ObservableCollection<string> _includeFolders;

    public ObservableCollection<string> IncludeFolders
    {
        get { return _includeFolders; }
    }

    public DatabaseRecord()
    {
        _includeFolders = new ObservableCollection<string>();
        _includeFolders.CollectionChanged += IncludeFolders_CollectionChanged;
    }

    private void IncludeFolders_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        Notify("IncludeFolders");
    }

    ...

}
person bniwredyc    schedule 12.12.2011
comment
Почему следует использовать ObservableCollection? - person C4d; 12.07.2016
comment
@ C4u его можно использовать для привязки данных в WPF (шаблон MVVM) - person bniwredyc; 12.07.2016

Самый простой способ заставить работать привязку списка WPF — использовать коллекцию, реализующую INotifyCollectionChanged. Здесь просто заменить или адаптировать ваш список на ObservableCollection.

Если вы используете ObservableCollection, то всякий раз, когда вы изменяете список, он вызывает событие CollectionChanged — событие, которое сообщает привязке WPF об обновлении. Обратите внимание, что если вы замените фактический объект коллекции, вы захотите вызвать событие propertychanged для фактического свойства коллекции.

person Philip Rieck    schedule 12.12.2011

Ваш список не будет автоматически запускать событие NotifyPropertyChanged для вас.

Элементы управления WPF, предоставляющие свойство ItemsSource, предназначены для привязки к свойству ObservableCollection<T>, которое будет автоматически обновляться при добавлении или удалении элементов.

person Adam Rackis    schedule 12.12.2011

Вам следует взглянуть на ObservableCollection.

person Andrew Kennan    schedule 12.12.2011