如何访问新创建的 ItemsControl 子控件?

How to access newly created ItemsControl children controls?

我正在创建地图 control/framework 库。我有一个主地图控件,其中可以包含多个图层控件。我计划让那些 LayerControls 继承自 ItemsControl,以允许用户使用 ItemTemplate 来定义各种对象,并绑定到 ViewModels 以显示在地图上,如图表、图钉、船舶等。

这是一个用法示例:

<map:Map
    Scale="{Binding Path=Scale}"
    CenterLocation="{Binding Path=CenterLocation}"
    MapParametersChangedCommand="{Binding Path=MapParametersChangedCommand}"
    MouseDoubleClickCommand="{Binding Path=ChartObjectInfoRequestedCommand}"
    UseWaitCursorIcon="{Binding Path=UseWaitCursorIcon}"
    >
    <map:Map.Layers>
        <layers:GeoImageLayer ItemsSource="{Binding Path=WmsLayerViewModel.WmsMaps}">
            <layers:GeoImageLayer.ItemTemplate>
                <DataTemplate DataType="{x:Type viewModels:WmsMapViewModel}">
                    <map:GeoImage
                        Source="{Binding Path=ImageSource}"
                        ImageOffset="{Binding Path=ImageTransform}"
                        />
                </DataTemplate>
            </layers:GeoImageLayer.ItemTemplate>
        </layers:GeoImageLayer>
    </map:Map.Layers>
</map:Map>

现在我的问题是: 当从 ItemTemplate 创建特定于地图的控件(图像、pin、ship 等)时,我需要访问它以订阅它们以订阅某些特定于地图的事件,然后取消订阅它们的删除。我希望所有这些都在内部处理,而不需要使用 ViewModels 来处理它。在 SO 上提出的其中一个问题中,有人提出了这个解决方案:

protected abstract class BaseGeoLayer : ItemsControl
{    
    protected BaseGeoLayer()
    {
        ((INotifyCollectionChanged) Items).CollectionChanged += OnCollectionChanged;
    }
    
    private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        // doing stuff
    }
}

但是 CollectionChanged 事件给出了绑定的 ViewModel,而不是控件。此外,我还必须考虑在运行时迭代这些子控件的可能性。

有没有不使用 VisualTreeHelper 的简单方法?

我通过添加由控件的 Loaded/Unloaded 事件触发的冒泡 RoutedEvent 设法获得了 created/removed 控件。