2017-08-29 45 views
0

我在我的WPF项目中使用Bing地图,并且我想使用通用样式的总体项目View with map。关于Bing映射并不重要,这里的问题是DataTemplate中定义的代码的可重用性,也适用于ViewModel的单个对象。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> 

在其他视图中,我只有单一的视图模型对象(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集合创建通用模板?

编辑

灰的回答作品,可惜只有这些属性中的DataTemplate,这是从ContentControl类继承。其他未正确绑定。

回答

1

其的ContentTemplate

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

添加ContentControl中和重用HeadingArrowsDataTemplate它的工作原理percetly,除的'米:MapLayer.Position = “{结合PointLocation}”'。 – Majak

+0

@Majak,不幸的是我对Map,MapItemsControl或MapLayer.Position不熟悉,以及它们是如何一起工作的,但我会尝试在ContentControl上重复'm:MapLayer.Position =“{Binding PointLocation}”'以及 – ASh

+0

OK这有所帮助。谢谢! – Majak