2016-10-11 5 views
1

У меня есть MapControl в UWP:Несколько DataTemplates с UWP MapItemsControl

<maps:MapControl x:Name="BikeMap" ZoomLevel="17" Center="{Binding CenterPoint, Mode=TwoWay}"> 
    <maps:MapItemsControl x:Name="MapItems" ItemsSource="{Binding BikePoints}" 
         ItemTemplate="{StaticResource BikePointTemplate}"/> 
</maps:MapControl> 

и я добавлять MapElements с помощью шаблонов данных XAML, моя ItemsSource представляет собой список простых объектов.

Но UWP, кажется, не обеспечивает способ указания DataType в виде DataTemplate и MapItemsControl не имеет свойства для установки DataTemplateSelector.

Кто-нибудь знает, как я могу использовать несколько шаблонов данных с помощью MapItemsControl и иметь выбранный шаблон данных, основанный на типе объекта в ItemsSource?

+0

Трудно поверить, что UWP MapItemsControl не получен из ItemsControl. Возможно, вы можете выбрать другую библиотеку карт, где MapItemsControl фактически является элементом ItemsControl с рабочим элементом ItemTemplateSelector, например [this one] (https://xamlmapcontrol.codeplex.com/). – Clemens

+0

Привет @ JayZuo-MSFT Я еще не пробовал, так как был занят. Я скоро доберусь до него! благодаря –

ответ

5

MapItemsControl Class не имеет объекта для установки DataTemplateSelector. Чтобы достичь того, чего вы хотите, мы можем использовать ContentControl, установив его как содержимое шаблона в DataTemplate, а затем используя ContentControl.ContentTemplateSelector, чтобы установить DataTemplateSelector.

Ниже приведен простой пример:

XAML:

<Page x:Class="UWPApp.MainPage" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:Maps="using:Windows.UI.Xaml.Controls.Maps" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="using:UWPApp" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     mc:Ignorable="d"> 
    <Page.Resources> 
     <DataTemplate x:Key="GreenDataTemplate"> 
      <StackPanel Background="Green"> 
       <TextBlock Margin="5" 
          Maps:MapControl.Location="{Binding Location}" 
          Maps:MapControl.NormalizedAnchorPoint="0.5,0.5" 
          FontSize="20" 
          Text="{Binding Name}" /> 
      </StackPanel> 
     </DataTemplate> 
     <DataTemplate x:Key="RedDataTemplate"> 
      <StackPanel Background="Red"> 
       <TextBlock Margin="5" 
          Maps:MapControl.Location="{Binding Location}" 
          Maps:MapControl.NormalizedAnchorPoint="0.5,0.5" 
          FontSize="20" 
          Text="{Binding Name}" /> 
      </StackPanel> 
     </DataTemplate> 

     <local:MyTemplateSelector x:Key="MyTemplateSelector" GreenTemplate="{StaticResource GreenDataTemplate}" RedTemplate="{StaticResource RedDataTemplate}" /> 
    </Page.Resources> 
    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
     <Maps:MapControl x:Name="MyMap" MapServiceToken="MapServiceToken"> 
      <Maps:MapItemsControl x:Name="MyMapItemsControl" ItemsSource="{Binding}"> 
       <Maps:MapItemsControl.ItemTemplate> 
        <DataTemplate> 
         <ContentControl Content="{Binding}" ContentTemplateSelector="{StaticResource MyTemplateSelector}" /> 
        </DataTemplate> 
       </Maps:MapItemsControl.ItemTemplate> 
      </Maps:MapItemsControl> 
     </Maps:MapControl> 
    </Grid> 
</Page> 

Code-Behind:

public class MyTemplateSelector : DataTemplateSelector 
{ 
    public DataTemplate GreenTemplate { get; set; } 
    public DataTemplate RedTemplate { get; set; } 

    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) 
    { 
     if (item != null) 
     { 
      if (item is GreenPOI) 
      { 
       return GreenTemplate; 
      } 

      return RedTemplate; 
     } 

     return null; 
    } 
} 

public class POI 
{ 
    public string Name { get; set; } 

    public Geopoint Location { get; set; } 
} 

public class GreenPOI : POI { } 

public class RedPOI : POI { } 

Это только для примера. В образце я использовал два шаблона данных с различным фоном, и я создаю пользовательский DataTemplateSelector, который может выбрать DataTemplate на основе типа объекта. И если у вас есть несколько типов объектов, вы также можете обратиться к этому ответу: How to associate view with viewmodel or multiple DataTemplates for ViewModel?

 Смежные вопросы

  • Нет связанных вопросов^_^