Событие List <string>INotifyPropertyChanged - PullRequest
21 голосов
/ 12 декабря 2011

У меня есть простой класс со строковым свойством и свойством List, и у меня реализовано событие INofityPropertyChanged, но когда я делаю. Добавить в строку List, это событие не срабатывает, поэтому мой конвертер для отображения в 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");
            }
        }
    }
}

Ответы [ 4 ]

37 голосов
/ 12 декабря 2011

Вы должны использовать 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");
    }

    ...

}
8 голосов
/ 12 декабря 2011

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

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

3 голосов
/ 12 декабря 2011

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

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

2 голосов
/ 12 декабря 2011

Вы должны взглянуть на ObservableCollection

...