CollectionChanged 事件未在静态 ObservableCollection 上触发
CollectionChanged Event is not firing on a static ObservableCollection
在一个 class 中,我将对象添加到我的 ObservableCollection。在另一个 class 中,我正在处理添加的对象,然后将其从集合中删除。
那两个 classes 无法相互通信,所以我决定去 static
集合(由于某些原因我只能访问 class 定义)
在我的第一个 class 中,所有元素都已正确添加(我检查了 Count
属性),在第二个 class 中,我订阅了 [=13] =] 事件。但是,该事件并未引发。我认为这是因为 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);
}
}
这里对我来说很好用:
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
来处理集合更改事件。它会在集合中进行任何更改(add/update/delete)时触发。因为它是您正在创建的委托,所以您必须指定 sender
谁拥有该事件和参数类型(它将处理什么),以便正确报告已发布的事件
更新
你只要看看你的代码。 class b
的实例还没有创建,class 的构造函数只有在 class 的新实例创建时才会自动调用。您正在 class b 的构造函数中创建 Event handler
。所以它还没有发布任何事件。这就是 collection_Change 事件未在您的代码段中触发的原因。
因此,您对 class C 的定义将类似于以下内容以注册事件:
public class C
{
B obj = new B();
public void func()
{
A.MyCollection.Add(1);
}
}
在一个 class 中,我将对象添加到我的 ObservableCollection。在另一个 class 中,我正在处理添加的对象,然后将其从集合中删除。
那两个 classes 无法相互通信,所以我决定去 static
集合(由于某些原因我只能访问 class 定义)
在我的第一个 class 中,所有元素都已正确添加(我检查了 Count
属性),在第二个 class 中,我订阅了 [=13] =] 事件。但是,该事件并未引发。我认为这是因为 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);
}
}
这里对我来说很好用:
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
来处理集合更改事件。它会在集合中进行任何更改(add/update/delete)时触发。因为它是您正在创建的委托,所以您必须指定 sender
谁拥有该事件和参数类型(它将处理什么),以便正确报告已发布的事件
更新
你只要看看你的代码。 class b
的实例还没有创建,class 的构造函数只有在 class 的新实例创建时才会自动调用。您正在 class b 的构造函数中创建 Event handler
。所以它还没有发布任何事件。这就是 collection_Change 事件未在您的代码段中触发的原因。
因此,您对 class C 的定义将类似于以下内容以注册事件:
public class C
{
B obj = new B();
public void func()
{
A.MyCollection.Add(1);
}
}