【发布时间】:2017-08-29 12:08:12
【问题描述】:
我在我的 WPF 项目中使用 Bing 地图,我想使用通用样式的整体项目视图和地图。关于 Bing 地图并不重要,这里的问题在于 DataTemplate 中定义的代码的可重用性,也适用于 ViewModel 的单个对象。
在以下代码中,有用于放置在地图上的图像的 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>
我在第一个 View for 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 的答案有效,但不幸的是仅适用于 DataTemplate 中的这些属性,这些属性继承自 ContentControl 类。其他没有正确绑定。
【问题讨论】: