如何在数组 属性 发生变化时收到通知?

How do I get notified when an array property changes?

我的 class 包含许多属性,我需要处理每个属性。

见下文:

public partial class my_form : Form
{
    private Image[] _imagelist;
    public Image[] imagelist
    {
        get
        {
            return _imagelist;
        }
        set
        {
            this._imagelist = value;
            this.on_imagelist_changed();
        }
    }

    private void on_imagelist_changed()
    {
        // do something.
    }

    private void button1_Click(object sender, EventArgs e)
    {
        /* set new imagelist */
        this.imagelist = getimagelist();
    }
}

是的,工作正常。

但是当我这样打电话的时候。

public partial class my_form
{
    private void listView1_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        int selectedIndex = this.listView1.SelectedItems[0].ImageIndex;
        this.imagelist[selectedIndex] = dosomething(this.imagelist[selectedIndex]);
    }
}

不叫on_imagelist_changed()。为什么?

我不能像这样通过索引器添加 属性。 :(

public partial class my_form
{
    public Image imagelist[int x]
    {
        get
        {
            return _imagelist[x];
        }
        set
        {
            this._imagelist[x] = value;
            this.on_imagelist_changed();
        }            
    }
}

谁能帮我解决这个问题?

我可以避免像这样 class 制作控件 C# Indexers 吗?

我提出了一些建议,他们让我试试ObservableCollection。我不明白这一点。可以作为我的榜样吗?

It's don't call on_imagelist_changed(). Why?

因为,坦率地说,imageList没有改变。 imageList 中的某些图像可能已更改,但您的代码仅对整个 imageList 的更改做出反应。作业调用 属性 的 get 两次;它从不调用 setter.

I can't add property by indexer like this.

没错。但是,您正确地注意到您可以使用可观察的集合:

public ObservableCollection<Image> Images {get;}

private void OnImageListChanged(
    object sender
,   NotifyCollectionChangedEventArgs e) {
    // do something.
}

public MyForm() {
    Images = new ObservableCollection<Image>();
    Images.CollectionChanged += OnImageListChanged;
}

因为您的 属性 获取并设置 pointer 到数组,而不是数组本身。因此,当您更改数组项时,指针保持不变。

这就是 properties should not return arrays.

的原因