2016-10-26 14 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. Я не понимаю об этом. Может быть кто-то для меня примером?

+0

Просто использовать списки вместо массивов (список частного _imagelist; общественность статического списка ImageList). Причина, по которой вы не можете сделать this.imagelist [selectedIndex] = dosomething (this.imagelist [selectedIndex]); потому что массив не был инициализирован (поэтому я рекомендую использовать список вместо этого, все, что вам нужно сделать, это imagelist = new List (), чтобы его инициализировать) – Innat3

+0

@ Innat3 Массив был инициализирован, иначе код будет авария. Ошибка не является крахом, но факт, что событие не «стреляет». – dasblinkenlight

ответ

2

это не называют 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; 
} 
+0

collectionchanged не срабатывает при обновлении элемента, поэтому обратите внимание, что вам нужно удалить или добавить элементы, чтобы заставить его работать. –

+0

@ M.kazemAkhgary Согласно документации, событие «возникает, когда элемент добавляется, удаляется, изменяется, перемещается или весь список обновляется». Это включает в себя назначение элемента обратно в список, как показывает OP (т. Е. 'This.Images [selectedIndex] = dosomething (this.Images [selectedIndex]);'). Событие не срабатывает, если OP изменяет элемент но без переназначения. – dasblinkenlight

+0

@dasblinkenlight Спасибо! –