WPF Добавление элемента в BindingList не обновляет другое свойство в Viewmodel - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть этот код в моей viewmodel (Singleton):

    /// <summary>
    /// Gets or sets the person list.
    /// </summary>
    /// <value>
    /// The person list.
    /// </value>
    public BindingList<Person> PersonList
    {
        get { return personList; }
        set
        {
            personList = value;
            OnPropertyChanged(nameof(PersonList));
            OnPropertyChanged(nameof(PersonCount));
        }
    }

    /// <summary>
    /// Gets the person count.
    /// </summary>
    /// <value>
    /// The person count.
    /// </value>
    public int PersonCount
    {
        get
        {
            return personList.Count();
        }
    }

Когда я добавляю Person в BindingList, он отображается в представлении правильно.Изменение одного из элементов BindingList отображается правильно.Но PersonCount не обновляется и отображается как «0».

Класс Person реализован так:

public class Person : NotificationObject
{
    #region Fields

    private string name;
    private DateTime birthDate;
    private string lastName;

    #endregion // Fields

    #region Construction
    #endregion // Construction

    #region Attributes

    public string Name
    {
        get { return name; }
        set
        {
            name = value;
            OnPropertyChanged(nameof(Name));
        }
    }

    public string LastName
    {
        get { return lastName; }
        set
        {
            lastName = value;
            OnPropertyChanged(nameof(LastName));
        }
    }

    public DateTime BirthDate
    {
        get { return birthDate; }
        set
        {
            birthDate = value;
            OnPropertyChanged(nameof(BirthDate));
            OnPropertyChanged(nameof(Age));
        }
    }

    public int Age
    {
        get { return (DateTime.Now - birthDate).Days/365; }
    }

    #endregion // Attributes

    #region Operations
    #endregion // Operations

    #region Implementation
    #endregion // Implementation
} // class Person

Почему PersonCount не обновляется и как это сделать правильно?Что я делаю не так?

Заранее спасибо, Андреас

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Проблема в вашем коде заключается в том, что после того, как вы связали «PersonList» с моделью представления, объект списка не изменится, пока вы не привяжете другой список (что происходит, если только элементы добавляются или удаляются из списка), поэтомуустановщик свойства «PersonList» не вызывается, и поэтому «свойство уведомления изменено» не запускается для «PersonCount».

Однако, поскольку PersonList является BindingList , добавленные / удаленные элементы отражаются в пользовательском интерфейсе.

Решения

1) Зарегистрируйте «PersonList» в ListChanged событие и вызовите «Уведомить об изменении свойства» в обработчике события.

    public BindingList<Person> PersonList
    {
        get { return personList; }
        set
        {
            if (personList != null)
                personList.ListChanged -= PersonList_ListChanged;

            personList = value;

            if (personList != null)
                personList.ListChanged += PersonList_ListChanged;

            OnPropertyChanged(nameof(PersonList));
        }
    }

    public PersonsDashboardViewModel()
    {
        PersonList = new BindingList<Person>();

        PersonList.Add(new Person("Name1", "Lname1"));
        PersonList.Add(new Person("Name2", "Lname2"));
    }

    private void PersonList_ListChanged(object sender, ListChangedEventArgs e)
    {
        OnPropertyChanged(nameof(PersonCount));
    }

ИЛИ

2) Вызовите «Уведомить об изменении свойства» для «Персона», где вы добавляете элементы персонажа.

    public void AddPersonItem()
    {
        PersonList.Add(new Person("Sean", "Brendon"));
        OnPropertyChanged(nameof(PersonCount));
    }
0 голосов
/ 23 ноября 2018

Вы должны вызвать OnPropertyChanged(nameof(PersonCount));, где вы изменяете список.Если это невозможно, вы должны подписаться на CollectionChanged для PersonList в установщике и вызвать OnPropertyChanged(nameof(PersonCount)); в обработчике событий.

...