如何使用INotifyPropertyChanged更新列表框项目

时间:2009-03-12 14:29:16

标签: c# winforms data-binding inotifypropertychanged

我有一个数据绑定到一组对象的列表框。 我想修改项目的显示方式,以向用户显示这些对象中的哪一个是我程序中的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 个答案:

答案 0 :(得分:2)

我很确定问题在于,当你这样做时,你有效地使Person.Name属性“get”访问者改变了值(就UI而言,就像一个set访问器一样) )。

然而,没有什么能够更新绑定来说明这种情况正在发生。如果在设置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
    }
}