2016-01-06 3 views
0

Это очень похоже на вопрос, но специфичный для списков.Выполнить метод каждый раз, когда список изменяется (не доступен)

How to trigger event when a variable's value is changed?

Каждый раз, когда мой список модифицирована Я хочу, чтобы запустить метод.

Я предположил, что использование свойства и метод в пределах 'set' будет правильным способом приблизиться к этому. Я начал что-то вроде этого

public class Stuff 
{ 
    private List<Things> _myThings; 

    public List<Things> MyThings 
    { 
     get 
     { 
      return _myThings;  
     } 
     private set 
     { 
      _myThings= value; 
      runWhenListIsChanged(); 
     } 
    } 
} 

Однако, когда я использую команду как «RemoveAt» или «RemoveRange»

public class StuffChanger 
{ 
    Stuff.MyThings.RemoveAt(5); 
} 

Он идет прямо в собственность «получить» и список изменяется.

Я неправомерно предположил, что он будет использовать set (как его изменение списка), но это не тот случай. При отладке (используя инструмент «шаг в» в Visual Studio) я заметил, что список можно изменить, используя «get» accessor.

В данном конкретном случае я не хочу, чтобы метод вызывался каждый раз, когда список читается чем-то, поскольку это может привести к увеличению производительности или вызвать переполнение стека. Так что это не вариант.

Буду очень признателен, если у кого есть советы или предложения по применению! Огромное спасибо.

+0

Вместо этого вы можете использовать 'ObservableCollection' и зарегистрировать' CollectionChangedEvent'. Он будет срабатывать при любых манипуляциях с коллекцией. –

ответ

2

Как вы заметили, код, который вы написали, чтобы манипулировать списком, фактически не устанавливает новый список в свойство.

Вместо этого код:

Stuff.MyThings.RemoveAt(5); 

можно рассматривать как аналог этого:

var list = Stuff.MyThings; 
list.RemoveAt(5); 

Как таковой, он считывает список из добытчика, а затем непосредственно манипулирует список сам.

Чтобы получать уведомления, когда сам список изменяется, вам необходимо использовать что-то другое, кроме List<T>, так как этот тип не имеет функций для поддержки этого требования.

Хорошим кандидатом будет ObservableCollection<T>, и вы подключите обработчик события к событию CollectionChanged.

Обратите внимание: это будет наблюдать только изменения в списке, а не элементы в списке. Если добавить или удалить элемент из списка, вы будете получать уведомления, но если выполнить такой код:

MyStuff.MyThings[0].SomeProperty = SomeNewValue; 

, то вы не получите никаких уведомлений от самого списка. Вам нужно будет реализовать что-то вроде INotifyPropertyChanged по типам элементов и подключить обработчики событий к ним, чтобы получить эти уведомления.

+0

Спасибо, Лассе. Я должен добавить, что я использую Unity 5.3, у которого нет .net 4.5+ (я считаю), поэтому мне, возможно, придется добавить собственный скрипт Observable Collection. – Jim

+0

Попробуйте 'BindingList'. –