我具有被数据绑定到对象的集合的列表框。 我要修改的项目被显示,以显示这些对象中的一个是在我的程序的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>();
    }
}

在形式I使用下面的代码

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

解决方案

我敢肯定,问题是,当你这样做,你有效地使Person.Name属性“得到”访问更改值(并尽量像一个set访问作为UI关注)。

然而,没有什么是真实更新绑定地说,这种情况正在发生。如果得到的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
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top