如何在阵列属性更改时收到通知?

时间:2016-10-26 11:00:06

标签: c# arrays indexing properties inotifypropertychanged

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

见下文:

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();
        }            
    }
}

有人可以帮我解决这个问题吗?

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

我找到了一些建议,他们告诉我试试ObservableCollection。我不明白这一点。对我来说可能是个例子吗?

2 个答案:

答案 0 :(得分:1)

  

不要拨打on_imagelist_changed()。为什么呢?

因为,直截了当地imageList没有改变。 imageList中的某些图片可能已更改,但您的代码仅对整个imageList的更改做出反应。作业将您的财产get召唤两次;它永远不会叫做二传手。

  

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

这是对的。但是,您正确地指出您可以使用可观察的集合:

public ObservableCollection<Image> Images {get;}

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

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

答案 1 :(得分:0)

因为您的媒体资源获取并设置 pointer 来设置数组,而不是数组本身。因此,当您更改数组项时,指针保持不变。

这就是properties should not return arrays的原因。