【问题标题】:WPF - Reusability of DataTemplate code out of items collectionWPF - 项目集合中数据模板代码的可重用性
【发布时间】: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 类。其他没有正确绑定。

【问题讨论】:

    标签: c# wpf templates mvvm


    【解决方案1】:

    添加 ContentControl 并为其 ContentTemplate 重用 HeadingArrowsDataTemplate

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

    【讨论】:

    • 除了m:MapLayer.Position="{Binding PointLocation}"之外,它可以正常工作。
    • @Majak,不幸的是,我不熟悉 Map、MapItemsControl 或 MapLayer.Position 以及它们如何协同工作,但我也会尝试在 ContentControl 上重复 m:MapLayer.Position="{Binding PointLocation}"
    • 好的,这有帮助。谢谢!
    • 不幸的是,它似乎只适用于 DataTemplate 中的这些属性,这些属性继承自 FrameworkElement 类。其他没有正确绑定。
    猜你喜欢
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    相关资源
    最近更新 更多