0

我有以下 XAML 代码:

<maps:Map Name="PlaygroundMap" Credentials="YOUR_BING_MAPS_KEY">
   <maps:MapItemsControl  
           x:Name="PlaygroundMapItems"
           my:MapExt.ClusteredItemsSource="{Binding Locations}" 
           ItemTemplate="{StaticResource PinTemplate}"/>
 </maps:Map>  

ClusteredItemsSource也是我自己的附加属性,带有以下代码(仅显示重要部分):

private static void OnItemsReceived(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var mapItemsControl = d as MapItemsControl;

            if(mapItemsControl == null) return;

            var map = VisualTreeHelper.GetParent(mapItemsControl); // this is always NULL
            var map2 = mapItemsControl.Parent; // this is always NULL

            var items = e.NewValue as IEnumerable<Location>;
             mapItemsControl.ItemsSource = items;
        }

所以我的要求是在 OnItemsReceived 方法中有 MAP 参考。我认为这很容易,因为如果再次检查 XAML,您将看到 mapItemsControl 是 Map 的子级(或 map 是 mapItemsControl 的父级)。

但不知何故,变量 map 和 map2 始终为 NULL。这是正常行为还是?

此外,如果这种“父”方法不起作用,您能否建议我在 MapItemsControl 中获取地图参考的其他选项(准确地说,在我的自定义附加属性中获取地图参考)。

顺便说一句,我正在为 WinRT 使用 Bing Maps SDK。

4

1 回答 1

1

如果您的控件不是可视化树的一部分,VisualTreeHelper 将无济于事 - 要么是因为它们尚未添加到其中(尚未引发 Loaded 事件),要么它们可能不使用标准的父/子控件关系触发器(通过一个逻辑上是 Panel、ContentControl 等的子级)

这里最好的方法实际上是忘记可视化树并使用绑定和视图模型。

于 2012-11-25T19:30:26.630 回答