在XAML中获取父对象

在XAML中获取父对象,xaml,windows-runtime,parent-child,bing-maps,winrt-xaml,Xaml,Windows Runtime,Parent Child,Bing Maps,Winrt Xaml,我有以下XAML代码: <maps:Map Name="PlaygroundMap" Credentials="YOUR_BING_MAPS_KEY"> <maps:MapItemsControl x:Name="PlaygroundMapItems" my:MapExt.ClusteredItemsSource="{Binding Locations}" ItemTemplate="{StaticR

我有以下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作为mapItemsControl;
if(mapItemsControl==null)返回;
var map=VisualTreeHelper.GetParent(mapItemsControl);//此值始终为空
var map2=mapItemsControl.Parent;//此值始终为空
var items=e.NewValue作为IEnumerable;
mapItemsControl.ItemsSource=items;
}
所以我的要求是在这个方法中有地图参考。我认为这很容易,因为如果再次检查XAML,您将看到mapItemsControl是Map的子级(或者Map是mapItemsControl的父级)

但不知何故,变量map和map2总是空的。这是正常行为还是正常行为

另外,如果这种“父”方法不起作用,您可以建议我在MapItemsControl中获取地图引用的其他选项是什么(确切地说,在自定义附加属性中获取地图引用)


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

如果控件不是可视化树的一部分,VisualTreeHelper将不会对您有所帮助,这可能是因为它们尚未添加到一个可视化树中(加载的事件尚未引发),也可能是因为它们没有使用标准的父/子控件关系触发器(逻辑上是面板、ContentControl等的子对象)


这里最好的方法就是忘记可视化树,改用绑定和视图模型。

谢谢。你的最后一句话就是我最后说的:)
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;
        }