形状类型绑定

时间:2012-12-15 06:54:42

标签: c# wpf

我已将Layer的ObservableCollection绑定到WPF中的TreeView

图层定义是:

public class Layer 
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Color { get; set; }
    public GeoType Type { get; set; }
}

public enum GeoType { Area, Line, Point }

这是TreeView XAML:

<TreeView  Grid.Column="0"
          ItemsSource="{Binding Layers}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding SubLayers}">
            <StackPanel Orientation="Horizontal">

                <Canvas Background="LightGray">
                    <Ellipse Fill="{Binding Color}"
                             Height="15"
                             Width="15"
                             StrokeThickness="5"
                             Stroke="{Binding Color}"/>
                </Canvas>

                <TextBlock Margin="20,0,0,0" Text="{Binding Path=Name}"/>
            </StackPanel>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

我想根据GeoType属性指定形状类型。我的意思是如果GeoType在XAML上面是Line而不是canvas,那么它应该是Line。 我怎么能用绑定做到这一点?我应该创建转换器吗?

1 个答案:

答案 0 :(得分:1)

您可以使用纯XAML进行此操作。

...
<Window.Resources>
    <DataTemplate x:Key="LineTemplate">
        <Line />
    </DataTemplate>
    <DataTemplate x:Key="EllipseTemplate">
        <Ellipse />
    </DataTemplate>
    ... etc
</Window.Resources>
...

<TreeView  Grid.Column="0"
          ItemsSource="{Binding Layers}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding SubLayers}">
            <StackPanel Orientation="Horizontal">
                <Canvas Background="LightGray">
                    <ContentControl Content="{Binding}">
                        <ContentControl.Style>
                            <Style TargetType="ContentControl">
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding Path=Type}" Value="{StaticResource local:GeoType.Line}">
                                        <Setter Property="ContentTemplate" Value="{StaticResource LineTemplate}" />
                                    </DataTrigger>
                                    <DataTrigger Binding="{Binding Path=Type}" Value="{StaticResource local:GeoType.Ellipse}">
                                        <Setter Property="ContentTemplate" Value="{StaticResource EllipseTemplate}" />
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </ContentControl.Style>
                    </ContentControl>
                </Canvas>

                <TextBlock Margin="20,0,0,0" Text="{Binding Path=Name}"/>
            </StackPanel>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

这只是众多可能的解决方案之一。 本地 GeoType 所在的命名空间。您应该装饰资源中的模板以使用数据绑定。