2016-10-26 3 views
1

私のクラスには多くのプロパティが含まれており、それぞれのプロパティを処理する必要があります。配列のプロパティが変更されたときにどのように通知されますか?

はこの下記を参照してください:

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を試してみましょう語った。Iこれについて理解していない。私のために誰かの一例であってよい?

+0

ちょうどリストの代わりに、アレイ(私的リスト _IMAGELIST; パブリック静的リストイメージリスト)を使用します。あなたができない理由this.imagelist [selectedIndex] = dosomething(this.imagelist [selectedIndex]);配列が初期化されていないためです(代わりにリストを使用することをお勧めします)。imagelist = new List ();初期化するために – Innat3

+0

@ Innat3配列は初期化されています。クラッシュ。エラーはクラッシュではありませんが、イベントが「発射」していないという事実です。 – dasblinkenlight

答えて

2

それはon_imagelist_changed()を呼び出すことはありませんです。なぜ?

非常に鈍いので、imageListは変更されていません。 imageListの一部の画像は変更されている可能性がありますが、コードはimageList全体の変更にのみ反応します。割り当ては、あなたの財産のgetを2回呼び出します。それは決してセッターを呼びません。

このようなインデクサーでプロパティを追加することはできません。

これは正しいです。しかし、あなたは正しく、あなたが監視可能なコレクションを使用できることに注意:

public ObservableCollection<Image> Images {get;} 

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

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

アイテムが更新されているときにcollectionchangedが実行されないため、アイテムを削除または追加して機能させる必要があります。 –

+0

@ M.kazemAkhgaryドキュメントによれば、イベントは「アイテムが追加、削除、変更、移動、またはリスト全体が最新表示されたときに発生します。これは、リストにアイテムを戻すこと、OPの表示方法を含む(つまり、this.Images [selectedIndex] = dosomething(this.Images [selectedIndex]);)OPが項目を変更した場合、イベントは発生しませんしかし、再割り当てせずに。 – dasblinkenlight

+0

@dasblinkenlightありがとう! –

関連する問題