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



我正在创建一个Map控件/框架库。我有一个主Map控件,它可以包含许多LayerControls。我计划让这些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创建特定于地图的控件(image、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事件提供绑定的ViewModels,而不是控件。此外,我还必须考虑在运行时迭代这些子控件的可能性。

有没有一种简单的方法可以在不使用VisualTreeHelper的情况下实现这一点?

我通过添加一个由控件的Loaded/Unloaded事件触发的冒泡RoutedEvent,成功地获得了创建/删除的控件。

最新更新