2011-09-05 108 views
0

我有一个silverlight应用程序,它显示道路上的汽车位置。XAML绑定动态创建的控件

我使用MVVM模式,所以我有一个MapPosition集合到我的viewmodel中。

我也使用外部SDK(来自ArcGIS)来执行我的绘图,所以限制是我需要绘制一个包含TemplateControl的Symbol对象,在该对象中我可以放置任何我想要的东西。

问题是我没有找到一种方法来绑定一个MapPosition对象(基本上只包含坐标和一些额外的信息)到模板,我真的很糟糕,因为我有一些属性,我真的需要绑定,例如改变图标的​​角度并显示工具提示。

这是我发现让它工作,但我真的不喜欢它的唯一途径:

 MarkerSymbol symbol = new MarkerSymbol(); 

     string xamlTemplate = String.Format(@" 
      <ControlTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" > 
       <Grid Width=""200"" Height=""200""> 
        <Grid.RenderTransform> 
         <TransformGroup> 
          <ScaleTransform ScaleX=""0.1"" ScaleY=""0.1"" /> 
          <RotateTransform Angle=""{0}"" CenterX=""10"" CenterY=""10"" /> 
         </TransformGroup> 
        </Grid.RenderTransform> 
        <Canvas VerticalAlignment=""Top"" HorizontalAlignment=""Center""> 
         <ToolTipService.ToolTip> 
          <ToolTip Content=""{1}""></ToolTip> 
         </ToolTipService.ToolTip> 
         <Canvas.RenderTransform> 
          <TranslateTransform X=""-50""/> 
         </Canvas.RenderTransform> 
         <Path Data=""F1 M 49.75,0L 0,200L 50,158.5L 100,200L 49.75,0 Z"" Fill=""#FF008F00"" Stroke=""Black""></Path> 
        </Canvas> 
       </Grid> 
      </ControlTemplate>", value.Course, value.ToolTip); 

     ControlTemplate template = new ControlTemplate(); 

     boatSymbol.ControlTemplate = (ControlTemplate)XamlReader.Load(xamlTemplate); 

然后我环在我的列表中的每个元素和动态创建的模板。

所以问题是:在我的集合的每个对象上绑定模板的正确方法是什么,并且在xaml中有模板而不是在我的代码隐藏中有一个丑陋的字符串?

非常感谢您的帮助!

回答

0

<BoatSymbol.ControlTemplate> 
    <ControlTemplate> 
      <Grid Width="200" Height="200"> 
       <Grid.RenderTransform> 
        <TransformGroup> 
         <ScaleTransform ScaleX="0.1" ScaleY="0.1" /> 
         <RotateTransform Angle="{Binding Angle}" CenterX="10" CenterY="10" /> 
        </TransformGroup> 
       </Grid.RenderTransform> 
       <Canvas VerticalAlignment="Top" HorizontalAlignment="Center"> 
        <ToolTipService.ToolTip> 
         <ToolTip Content="{Binding Course}"></ToolTip> 
        </ToolTipService.ToolTip> 
        <Canvas.RenderTransform> 
         <TranslateTransform X="-50"/> 
        </Canvas.RenderTransform> 
        <Path Data="F1 M 49.75,0L 0,200L 50,158.5L 100,200L 49.75,0 Z" Fill="#FF008F00" Stroke="Black"></Path> 
       </Canvas> 
      </Grid> 
     </ControlTemplate> 
</BoatSymbol.ControlTemplate> 

假设BoatSymbol的DataContext设置为适当的视图模型。

+0

嗨,谢谢你的回答!但问题是如何为每个模板设置适当的数据上下文。使用list和DataTemplate很容易,因为你指定了ItemsSource,但是如果我通过在我的集合上循环来在代码中创建我的项目,它会工作吗? –