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中,数组已初始化,否则代码将崩溃。虽然错误不是崩溃,但事实是事件未“触发”。