XAML中ItemsSource的自定义对象数组,用于设计预览

时间:2014-06-25 14:44:47

标签: c# wpf xaml

我想在Canvas上使用ItemsControl绘制自定义类的对象。要在VisualStudio 设计器中使用某种预览,我会添加ItemsSource一些Collection个演示对象。但我无法弄清楚如何声明我的对象的集合

使用Point我可以使用PointCollection

<ItemsControl Name="pointsItems2">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas Width="100" Height="100">
                <Canvas.Background>
                    <SolidColorBrush Color="LightGray" Opacity="0.5"/>
                </Canvas.Background>
            </Canvas>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Ellipse Width="10" Height="10" Stroke="Red" StrokeThickness="1" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <!-- Setting the position with a style is necessary. Setting parent properties in the template does not work -->
    <ItemsControl.ItemContainerStyle>
        <Style TargetType="ContentPresenter">
            <!-- The offset converter moves the center of the circle to the desired position. ConverterParameter is the offset.-->
            <Setter Property="Canvas.Left" Value="{Binding X, Converter={StaticResource ResourceKey=OffsetConverter}, ConverterParameter='-5'}"/>
            <Setter Property="Canvas.Bottom" Value="{Binding Y, Converter={StaticResource ResourceKey=OffsetConverter}, ConverterParameter='-5'}"/>
        </Style>
    </ItemsControl.ItemContainerStyle>
    <ItemsControl.ItemsSource>
        <PointCollection>
            <Point X="0"   Y="0"   />
            <Point X="10"  Y="10"  />
            <Point X="20"  Y="40"  />
            <Point X="30" Y="90" />
        </PointCollection>
    </ItemsControl.ItemsSource>
</ItemsControl>

现在我有一个类,它具有我用作坐标的属性,还有我以后需要具有图形表示的其他属性。所以我想将文字指定的ItemsSource更改为代表我的类对象的东西。 我想出了

<x:Array Type="{x:Type Point}">
    <Point X="0" Y="0"/>
    <Point X="100" Y="100"/>
</x:Array>

这里的问题是,当我想要实例化我的类时,将调用默认构造函数,我可以通过属性设置属性,但我的类依赖于< strong>参数化构造函数和公共属性具有公共setter

如何以优雅的WPF / XAML方式实现这一目标?

1 个答案:

答案 0 :(得分:0)

基本上 - 你不能。 XAML 2009支持传递构造函数参数,但根据MSDN,这不适用于WPF - 至少不是您描述的方式。它可以在稍后包含的XAML文件中,但不在编译文件中,因此我认为它不适用于设计器。

为什么不能创建无参数构造函数并将属性更改为具有公共setter?

如果没有充分的理由,那么可以为参数创建一个虚拟持有类,并使用ValueConverter将ItemsSource绑定到这些虚拟类的集合,从虚拟类转到所需的类。这样您就可以在代码中构造并使用参数化构造函数。