我的类包含许多属性,我需要处理每个属性。
见下文:
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。我不明白这一点。对我来说可能是个例子吗?
答案 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 来设置数组,而不是数组本身。因此,当您更改数组项时,指针保持不变。