如何在数组 属性 发生变化时收到通知?
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 到数组,而不是数组本身。因此,当您更改数组项时,指针保持不变。
的原因
我的 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 到数组,而不是数组本身。因此,当您更改数组项时,指针保持不变。
的原因