如何检测何时从 UI 中删除模板化用户控件(而不仅仅是隐藏在 UI 中)

本文关键字:UI 控件 用户 不仅仅是 隐藏 何时 检测 何检测 删除 | 更新日期: 2023-09-27 18:32:23

我有一个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处理程序的主体中检测我的控件是否肯定被删除,而不仅仅是隐藏?

如何检测何时从 UI 中删除模板化用户控件(而不仅仅是隐藏在 UI 中)

因为你的"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);
}