我能阻止ListBox吗?RefreshItem(对象项)从删除和重新添加对象

本文关键字:对象 删除 新添加 添加 ListBox RefreshItem | 更新日期: 2023-09-27 18:04:39

我遇到的问题是,当我更新我的对象时,ListBox自动删除然后重新将对象添加到列表中,从而调用索引和值更改事件。我能够通过创建自定义ListBox控件来防止这种情况,当调用PropertyChangedEvent时,我将引发一个标志,以防止基类中的这些事件被调用。现在发生的事情是,我的整个引用被一个新的引用所取代,除非我重新选择列表框中的项目,否则我有错误的引用。

我基本上想做的是,改变我的对象中的显示值然后让它只更新列表框中的文本。我不希望它删除并重新添加对象/引用/它所做的任何事情。真烦人。

这是我正在使用的示例代码…

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.myListBox1.SelectedValueChanged += this.onchange;
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        this.myListBox1.Add(new strobj("z"));
        this.myListBox1.Add(new strobj("a"));
        this.myListBox1.Add(new strobj("b"));
        this.myListBox1.Add(new strobj("f"));
        this.myListBox1.Add(new strobj("n"));
        this.myListBox1.Add(new strobj("h"));
        this.myListBox1.Add(new strobj("p"));
        this.myListBox1.Add(new strobj("t"));
        this.myListBox1.Add(new strobj("c"));
        this.myListBox1.Add(new strobj("q"));
    }
    private void onchange(object sender, EventArgs e)
    {
        MessageBox.Show("Hello World");
    }
    int i = 0;
    private void button1_Click(object sender, EventArgs e)
    {

        if (this.myListBox1.SelectedItem != null)
        {
            strobj item = (strobj)this.myListBox1.SelectedItem;
            item.Name1 = i++.ToString();
        }
    }
}
public partial class MyListBox
{
    public MyListBox()
    {
        InitializeComponent();
    }
    public void Add(strobj item)
    {
        item.OnNameChanged += this.MyDispalyMemberChanged;
        this.Items.Add(item);
    }
    bool refreshing = false;
    public void MyDispalyMemberChanged(strobj itemChanged)
    {
        this.refreshing = true;
        this.RefreshItem(this.Items.IndexOf(itemChanged));
        this.refreshing = false;
    }
    protected override void OnSelectedValueChanged(EventArgs e)
    {
        if (!this.refreshing)
        {
            base.OnSelectedValueChanged(e);
        }
    }
}
class strobjCollection : List<strobj>
{
    NameChangeEventHandler NameChangedEvent;
}
delegate void NameChangeEventHandler(strobj sender);
public class strobj
{
    internal NameChangeEventHandler OnNameChanged;
    private string _Name1;
    public string Name1
    {
        get { return this._Name1; }
        set
        {
            this._Name1 = value;
            if (this.OnNameChanged != null)
            {
                this.OnNameChanged(this);
            }
        }
    }
    public int i = 0;
    public string str = "p";
    public strobj(string name)
    {
        this._Name1 = name;
    }
    public strobj()
    {
        this._Name1 = "You did not create this object";
    }
    public override string ToString()
    {
        return this._Name1;
    }
}

我能阻止ListBox吗?RefreshItem(对象项)从删除和重新添加对象

这就是INotifyPropertyChanged接口的目的。

你可以用你在事件参数中设置的属性名来引发PropertyChanged事件,而不是引发你的自定义事件,然后列表框就会更新。

查看MSDN。