XAML与动态创建的控件绑定

时间:2011-09-05 14:17:41

标签: silverlight xaml data-binding

我有一个Silverlight应用程序,显示道路上的汽车位置。

我正在使用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中有模板而不是在我的代码隐藏中有一个丑陋的字符串?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分: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设置为适当的视图模型。