C# 当数组属性更改时,如何获得通知?

C# 当数组属性更改时,如何获得通知?,c#,arrays,indexing,properties,inotifypropertychanged,C#,Arrays,Indexing,Properties,Inotifypropertychanged,我的类包含许多属性,我需要处理每个属性 见下文: public partial class my_form : Form { private Image[] _imagelist; public Image[] imagelist { get { return _imagelist; } set { this._imagelist = value

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

见下文:

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]);
    }
}
这是不调用\u imagelist\u changed()上的
。为什么?

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

公共部分类我的表单
{
公共图像图像列表[int x]
{
得到
{
返回imagelist[x];
}
设置
{
此._imagelist[x]=值;
此。在_imagelist_中已更改();
}            
}
}
有人能帮我解决这个问题吗

我可以避免创建这样的控件类吗

我提出了一些建议,他们告诉我让我试试。我不明白这一点。也许有人能给我举个例子吗

这是不调用imagelist上的
。\u changed()
。为什么

因为,非常坦率地说,
imageList
没有更改。
imageList
中的一些图像可能已更改,但您的代码只对整个
imageList
的更改作出反应。赋值调用属性的
get
两次;它从不调用setter

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

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]);
    }
}
没错。但是,您正确地指出,您可以使用可观察的集合:

public ObservableCollection<Image> Images {get;}

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

public MyForm() {
    Images = new ObservableCollection<Image>();
    Images.CollectionChanged += OnImageListChanged;
}
publicobservableCollection映像{get;}
私有void OnImageListChanged(
对象发送器
,NotifyCollectionChangedEventArgs(e){
//做点什么。
}
公共MyForm(){
图像=新的ObservableCollection();
Images.CollectionChanged+=onimageristchanged;
}

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


这就是为什么。

collectionchanged在更新项目时不会触发,因此请注意,您必须删除或添加项目才能使其正常工作。@M.kazemAkhgary根据文档,事件“在添加、删除、更改、移动项目或刷新整个列表时发生。”这包括将项目分配回列表,即OP显示的方式(即
This.Images[selectedIndex]=dosomething(This.Images[selectedIndex]);
)如果OP修改项目而不重新分配,则不会触发事件。@dasblinkenlight谢谢!只需使用列表而不是数组即可(private List _imagelist;public static List imagelist)。您无法执行此操作的原因。imagelist[selectedIndex]=dosomething(this.imagelist[selectedIndex]);是因为数组尚未初始化(这就是为什么我建议使用列表,您只需执行imagelist=new List();即可初始化它)@在NAT3中,数组已初始化,否则代码将崩溃。虽然错误不是崩溃,但事实是事件未“触发”。