0

В одном классе я добавляю объекты в свой ObservableCollection. И в другом классе я делаю материал с добавленным объектом, а затем удаляю его из коллекции.CollectionChanged Событие не срабатывает при статическом ObservableCollection

Эти два класса не могут общаться друг с другом, так что я решил пойти на static коллекции (я только иметь доступ к определению класса для какой-то причине)

В моем первом классе, все элементы добавляются правильно (I проверили свойство Count), во втором классе подписываюсь на событие CollectionChanged. Однако мероприятие не поднимается. Я думаю, что это из-за ключевого слова static, но я не уверен.

Вот пример кода:

static public class A 
{ 
public static ObservableCollection<object> MyCollection = new ObservableCollection<object>(); 
} 

public class B 
{ 
public B() 
{ 
A.MyCollection.CollectionChanged += Func_CollectionChanged; 
} 
void Func_CollectionChanged(...) 
{ 
    //Stuff 
} 
} 
public class C 
{ 
    public void func() 
    { 
    A.MyCollection.Add(object); 
    } 
} 
+0

выше фрагмент кода не так: как вы можете получить доступ к MyCollection, определенное в «А» без указания A в C -класс? –

+0

Исправлен фрагмент кода. Вы поняли мою проблему даже с этой маленькой ошибкой. –

ответ

2

Вот она отлично работает для меня:

class Program 
    { 
     static void Main(string[] args) 
     { 
      B obj = new B(); 
     } 
    } 
    public class A 
    { 
     public static ObservableCollection<object> MyCollection = new ObservableCollection<object>(); 
    } 
    public class B 
    { 
     public B() 
     { 
      A.MyCollection.CollectionChanged += Func_CollectionChanged; 
      A.MyCollection.Add(1); 
     } 

     private void Func_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
     { 
      // do some stuff here 
     } 
    } 

с помощью A.MyCollection.CollectionChanged линии вы создаете EventHandler для обработки события Изменения коллекции. он запускает когда-либо любые изменения (добавить/обновить/удалить), сделанные в коллекции. поскольку она является делегатом вы создаете, вы должны указать sender, которым принадлежит событию и типу аргументов (Что он собирается обращаться), в-для того, чтобы получить надлежащую отчетность публикуемого события

Updates

Вы просто заглянете в свой код. экземпляр class b еще не создан, конструктор этого класса будет автоматически вызываться только при создании нового экземпляра класса. Вы создаете Event handler внутри конструктора класса b. Так что пока не опубликовано ни одного события. это является причиной того, что событие collection_Change не запускается в фрагменте кода.

Следовательно, ваше определение для класса C будет иметь следующий вид зарегистрировать событие:

public class C 
    { 
     B obj = new B(); 
     public void func() 
    {   
    A.MyCollection.Add(1); 
    } 
    } 
+0

Это не работает для меня ... Я дал вам плохую часть кода, я только что редактировал свой вопрос. Я использую другую среду (SDK программного обеспечения), возможно, это проблема. Я просто хочу убедиться, что я правильно делаю –