我有一个列表框,它与对象集合进行数据绑定。
我想修改项目的显示方式,以向用户显示这些对象之一是我的程序中的 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;
}
我很确定问题在于,当您这样做时,您实际上是在使 Person.Name 属性“get”访问器更改值(并且就 UI 而言,其行为类似于 set 访问器)。
然而,没有任何东西更新绑定来表明这种情况正在发生。如果 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
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)