我有一个ItemsControl
,它的ItemsSource
绑定到一个ObservableCollection<T>
,使用我自己的UserControl
作为ItemTemplate
:
<ItemsControl ItemsSource="{Binding Path=MyObservableColletion, Mode=OneWay}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<MyControls:MyUserControl />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
我已经连接了它,以便在向集合添加/删除项目时更新 UI。
当从集合中删除项目时,我想在代表性模板化MyUserControl
的代码隐藏中检测到这一点。我该怎么做?
我确实注意到在这种情况下触发了Unloaded
事件,但这不足以满足我的目的,因为当包含我的ItemsControl
的 UI 被简单地隐藏/折叠时(例如,当它在TabControl
中并且选项卡被切换掉时),Unloaded
也会触发。
是否有其他事件用于此目的,或者是否有一种方法可以在Unloaded
处理程序的主体中检测我的控件是否肯定被删除,而不仅仅是隐藏?
因为你的"MyObservableColletion"应该是ObservableCollection的类型,你应该能够订阅它的"CollectionChanged"事件。其事件处理程序将在添加和删除时触发。在事件参数中,您将找到 oldItems 数组,该数组将包含从集合中删除的集合。
public void CollectionChangedEventHandler(object sender, NotifyCollectionChangedEventArgs args)
{
var deletedItem = args.OldItems.FirstOrDefault();
}
在 WPF 中,您不处理代码中的控件。 从来没有。您可以使用控件表示的数据。
我们需要检查断开连接的UserControl
是否更改了任何属性。一个这样的属性是DataContext
,因为UserControl
不在ItemsControl
中,所以它DataContext
将被重置。对于断开连接的控件,它设置为 {DisconnectedItem}
.
将此代码添加到您的UserControl
中。
protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
{
if (e.Property.Name == "DataContext" && e.NewValue.ToString() == "{DisconnectedItem}")
{
System.Diagnostics.Debug.WriteLine(this + " : I am removed !");
}
base.OnPropertyChanged(e);
}