XAML绑定对象数组中的对象

时间:2015-06-24 12:06:53

标签: c# arrays wpf xaml data-binding

我正在尝试实现XAMLMapControl的自定义路由,这些路由将具有可选择的可移动点(示例地图点)和连接它们的折线,并且可以通过visibility属性打开/关闭。我有一个类Route和一个自定义用户控件,它应该生成折线和我发送给它的路由类中的点。我通过一系列路由将路由对象发送给它。问题是我不能让它实际获取数据并渲染点和折线。 这是我的RouteControl.XAML

<UserControl x:Class="Map_Test.RouteControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:map="clr-namespace:MapControl;assembly=MapControl.WPF">
<UserControl.Resources>
<Style x:Key="PointItemStyle" TargetType="map:MapItem" >
        <Setter Property="map:MapPanel.Location" Value="{Binding Location}"/>
        <Setter Property="Foreground" Value="Black"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="map:MapItem">
                <Canvas>
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Normal"/>
                            <VisualState x:Name="Disabled"/>
                            <VisualState x:Name="MouseOver">
                                <Storyboard>
                                    <DoubleAnimation Storyboard.TargetName="labelBackground" Storyboard.TargetProperty="Opacity" To="0.7" Duration="0:0:0.1"/>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                        <VisualStateGroup x:Name="SelectionStates">
                            <VisualState x:Name="Unselected"/>
                            <VisualState x:Name="Selected">
                                <Storyboard>
                                    <DoubleAnimation Storyboard.TargetName="selectedPath" Storyboard.TargetProperty="Opacity" To="0.7" Duration="0:0:0.1"/>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Path x:Name="selectedPath" Fill="White" Opacity="0">
                        <Path.Data>
                            <EllipseGeometry RadiusX="15" RadiusY="15"/>
                        </Path.Data>
                    </Path>
                    <Path StrokeThickness="2" Fill="Transparent">
                        <Path.Stroke>
                            <SolidColorBrush Color="Gray"/>
                        </Path.Stroke>
                        <Path.Data>
                            <EllipseGeometry RadiusX="8" RadiusY="8"/>
                        </Path.Data>
                    </Path>
                    <Grid Canvas.Left="15" Canvas.Top="-8">
                        <Rectangle x:Name="labelBackground" Fill="White" Opacity="0"/>
                        <!--local:OutlinedText Margin="1" OutlineThickness="1.5" Text="{Binding Name}"/-->
                    </Grid>
                </Canvas>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="Panel.ZIndex" Value="1"/>
        </Trigger>
    </Style.Triggers>
</Style>
</UserControl.Resources>
<map:MapPanel>
    <map:MapPolyline Locations="{Binding Locations, RelativeSource={RelativeSource AncestorType=UserControl}}"
                     Stroke="{Binding Foreground, RelativeSource={RelativeSource AncestorType=UserControl}}"
                     StrokeThickness="3"/>
    <map:MapItemsControl ItemsSource="{Binding Points}"
                             ItemContainerStyle="{StaticResource PointItemStyle}"
                             IsSynchronizedWithCurrentItem="True"
                             SelectionMode="Extended"
                             MouseLeftButtonDown="PathMouseLeftButtonDown"
                             MouseLeftButtonUp="PathMouseLeftButtonUp"
                             MouseMove="PathMouseMove"/>       
</map:MapPanel>

我的路线课

    public class RoutePoint : PropertyChangedBase
{
    private Location location;
    public Location Location
    {
        get { return location; }
        set
        {
            location = value;
            NotifyOfPropertyChange(() => location);
        }
    }
}

public class Route : PropertyChangedBase
{
    public ObservableCollection<RoutePoint> Points { get; set; }
    public BindableCollection<Location> Locations{ get; set; }
    public bool Visible { get; set; }
    public Route()
    {
        Locations = new BindableCollection<Location>();
        Points = new ObservableCollection<RoutePoint>();
        Visible = true;
        Location = new Location();
    }
}

}

我创建像这样的对象

<DataTemplate x:Key="RouteTemplate">
        <local:RouteControl DataContext="Routes"></local:RouteControl>
    </DataTemplate>
...
<map:MapItemsControl ItemTemplate="{StaticResource RouteTemplate}"
                             ItemsSource="{Binding Routes}"/>

如何从xaml访问Route集合的每个对象中的Locations数组和RoutePoints数组?

1 个答案:

答案 0 :(得分:0)

找到解决方案: 我没有制作自定义控件,而是使用面板中的控件创建了自定义样式。 这就是它的外观

   <Style x:Key="RouteTemplate"  TargetType="map:MapItem">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Visible}" Value="True"></DataTrigger>
        </Style.Triggers>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="map:MapItem">
                    <map:MapPanel>
                    <map:MapPolyline Locations="{Binding Locations}" Stroke="Red" StrokeThickness="3"/>
                        <map:MapItemsControl ItemsSource="{Binding Points}"
                             ItemContainerStyle="{StaticResource PointItemStyle}"
                             IsSynchronizedWithCurrentItem="True"
                             SelectionMode="Extended" AllowDrop="True"/>
                    </map:MapPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

我像这样绑定它

<map:MapItemsControl ItemContainerStyle="{StaticResource RouteTemplate}"
                             ItemsSource="{Binding Routes}"/>
相关问题