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 で Map 参照を取得するための他のオプションを教えてください (正確には、カスタム添付プロパティでマップ参照を取得するため)。

ところで、私は Bing Maps SDK for WinRT を使用しています。

4

1 に答える 1

1

VisualTreeHelper は、コントロールがまだビジュアル ツリーに追加されていない (Loaded イベントがまだ発生していない) か、標準の親/子コントロール関係トリガーを使用していないため、コントロールがビジュアル ツリーの一部でない場合は役に立ちません。 (1 つは論理的には Panel、ContentControl などの子です)

ここでの最善のアプローチは、ビジュアル ツリーを忘れて、代わりにバインディングとビュー モデルを使用することです。

于 2012-11-25T19:30:26.630 に答える