gpt4 book ai didi

c# - ObservableCollection 和 OnCollectionChanged

转载 作者:太空宇宙 更新时间:2023-11-03 20:39:42 27 4
gpt4 key购买 nike

我正在学习 WPF 中的 ObservableCollections,但有些事情我不清楚。我知道如果我将一个控件绑定(bind)到一个 ObservableCollection 并且该集合发生变化,该控件将反射(reflect)这些变化。我的问题是:

  • ObservableCollection 实现 INotifyCollectionChanged,这只是一个事件,CollectionChanged。只要集合发生变化,就应该触发该事件,但是谁订阅了该事件?当您创建集合的绑定(bind)时,它会自动完成吗?

  • 我正在使用 Reflector 查看 ObservableCollection,并试图查看 CollectionChanged 事件何时被触发。但是我找不到它在哪里完成。例如,当我向集合中添加新项目时,我想查看它何时被触发。 Add(...) 在 ObservableCollection 的基类 Collection 中实现,但 Collection 没有实现 INotifyCollectionChanged,所以我不明白如何通知绑定(bind)控件发生变化。

我猜很多事情都是在幕后处理的,但非常感谢任何信息。

最佳答案

要回答您的第一个问题:这一切都始于 ItemContainerGenerator 类的“Items”属性(所有 ItemsControl 对象都有一个实例)。如果您查看上述“Items”属性的 setter ,您会发现它有特殊的逻辑来检查给定的 IList 是否属于 INotifyCollectionChanged 类型,它会附加一个事件监听器。

ItemContainerGenerator.Items 属性:


internal IList Items
{
get
{
return this._items;
}
set
{
if (this._items != value)
{
INotifyCollectionChanged source = this._items as INotifyCollectionChanged;
if ((this._items != this.Host.View) && (source != null))
{
CollectionChangedEventManager.RemoveListener(source, this);
}
this._items = value;
source = this._items as INotifyCollectionChanged;
if ((this._items != this.Host.View) && (source != null))
{
CollectionChangedEventManager.AddListener(source, this);
}
}
}
}

它确实与绑定(bind)无关。看,如果您有以下根本不使用绑定(bind)的代码,集合更改通知仍然有效:

<Window x:Class="DynamicObjectTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel>
<Button Click="Button_Click">click</Button>
<ListBox x:Name="listBox"/>
</StackPanel>
</Grid>
</Window>

public partial class MainWindow : Window
{
ObservableCollection items = new ObservableCollection();

public MainWindow()
{
InitializeComponent();

this.listBox.ItemsSource = items;
}

private void Button_Click(object sender, RoutedEventArgs e)
{
items.Add("A");
}
}

关于c# - ObservableCollection<T> 和 OnCollectionChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3576782/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com