как обновить элементы списка с помощью INotifyPropertyChanged - PullRequest
2 голосов
/ 12 марта 2009

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

Я пытался сделать это следующим образом, но список не обновляется автоматически. Аннулирование элемента управления также не сработало.

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

Есть ли другой способ?

class Person : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private string _name;
    public string Name
    {
        get
        {
            if (PersonManager.Instance.StartPerson == this)
                return _name + " (Start)";                      
            return _name;
        }
        set
        {
            _name = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("Name"));
        }
    }

    public Person(string name)
    {
        Name = name;
    }
}

Это класс, который управляет списком и элементом, который является началом

class PersonManager
{
    public BindingList<Person> persons { get; set; }
    public Person StartPerson { get; set; }

    private static PersonManager _instance;
    public static PersonManager Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = new PersonManager();
            }
            return _instance;
        }
    }

    private PersonManager()
    {
        persons = new BindingList<Person>();
    }
}

В форме я использую следующий код

    private void button1_Click(object sender, EventArgs e)
    {
        PersonManager.Instance.StartPerson = (Person)listBox1.SelectedItem;
    }

1 Ответ

2 голосов
/ 12 марта 2009

Я почти уверен, что проблема в том, что, когда вы делаете это, вы фактически заставляете свойства Person.Name «получить» аксессор, изменяющий значение (и действующий как установленный аксессор в отношении пользовательского интерфейса) ).

Однако нет ничего, что обновляет привязки, чтобы сказать, что это происходит. Если при запуске start вызывается PropertyChanged, я думаю, что это обновит.

Это неуклюже, но, как вы это написали, я думаю, вы могли бы добавить это и заставить это работать (ПРИМЕЧАНИЕ: я не проверял это, так что ~ может ~ иметь проблемы):

private void button1_Click(object sender, EventArgs e)
{
    Person newStart = (Person)listBox1.SelectedItem;
    if (newStart != null)
    {
        PersonManager.Instance.StartPerson = newStart;
        newStart.Name = newStart.Name; // Dumb, but forces a PropertyChanged event so the binding updates
    }
}
...