2017-08-29 9 views
0

私はWPFプロジェクトでBingマップを使用しています。一般的なスタイルの全体的なプロジェクトView with mapを使用したいと思います。これはBingマップに関する重要なことではありません。ここでの問題は、ViewModelの単一オブジェクトに対してもDataTemplateで定義されたコードの再利用性です。WPF - アイテムコレクションからのDataTemplateコードの再利用

次のコードには、マップ上に配置されたイメージ用のDataTemplateがあります。コレクションのViewModel項目にいくつかのプロパティがバインドされています。

<DataTemplate x:Key="HeadingArrowsDataTemplate"> 
    <Image Source="/Intens.C2XTestPlatform.Frontend;component/Images/Maps/Arrow.png" 
      m:MapLayer.Position="{Binding PointLocation}" 
      RenderTransformOrigin="0.5,1" 
      Width="100" 
      Height="100" 
      Visibility="{Binding Path=PointLocation, Converter={StaticResource IsNotNullVisibilityConverter}}"> 
     <Image.RenderTransform> 
      <TransformGroup> 
       <RotateTransform Angle="{Binding Heading}" /> 
       <TranslateTransform X="-50" 
            Y="-100" /> 
      </TransformGroup> 
     </Image.RenderTransform> 
    </Image> 
</DataTemplate> 

私はのviewmodelsコレクション(RelevanceLinesVM)の最初のビューでそれを使用します。他のビューで

<m:Map CredentialsProvider="{Binding MapCredentialsProvider}" 
      Mode="Road" 
      x:Name="ucMap"> 
     <m:MapItemsControl ItemsSource="{Binding RelevanceLinesVM}" 
          helpers:MapFixBehavior.FixUpdate="True" 
          ItemTemplate="{StaticResource HeadingArrowsDataTemplate}" 
    </m:Map> 

、私は、単一のViewModelオブジェクト(RelevanceLineVM)を持っている、と私はコピー&ペーストするためのコードを持っていますDataTemplateから同じ外観とバインディングを取得します。

<m:Map Name="ucMap" 
      Mode="Road" 
      CredentialsProvider="{Binding MapCredentialsProvider}"> 
     <Image DataContext="{Binding RelevanceLineVM}" 
       Source="/Intens.C2XTestPlatform.Frontend;component/Images/Maps/Arrow.png" 
       RenderTransformOrigin="0.5,1" 
       Width="100" 
       Height="100" 
       m:MapLayer.Position="{Binding PointLocation}" 
       Visibility="{Binding Path=PointLocation, Converter={StaticResource IsNotNullVisibilityConverter}}"> 
      <Image.RenderTransform> 
       <TransformGroup> 
        <RotateTransform Angle="{Binding Heading}" /> 
        <TranslateTransform X="-50" 
             Y="-100" /> 
       </TransformGroup> 
      </Image.RenderTransform> 
     </Image> 
    </m:Map> 

単一のViewModelとViewModelの両方のコレクションで共通のテンプレートを作成するにはどうすればよいですか?

編集

ASHの答えの作品が、残念ながら唯一ContentControlクラスから継承されたDataTemplateでは、これらの特性のために。他は適切に束縛されていません。

答えて

1

はContentControlにを追加し、それがM 'のを除いて、percetly働くそのContentTemplate

<m:Map Name="ucMap" 
     Mode="Road" 
     CredentialsProvider="{Binding MapCredentialsProvider}"> 
    <ContentControl Content="{Binding RelevanceLineVM}" 
        ContentTemplate="{StaticResource HeadingArrowsDataTemplate}"/> 
</m:Map> 
+0

ためHeadingArrowsDataTemplateを再利用:MapLayer.Position = "{バインディングPointLocation}" '。 – Majak

+0

@Majak、残念ながら私はMap、MapItemsControl、MapLayer.Positionとそれらがどのように連携しているかに精通していませんが、ContentControlで 'm:MapLayer.Position =" {Binding PointLocation} "を繰り返すこともできます。 – ASh

+0

OKこれは助けになった。ありがとう! – Majak