我想在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方式实现这一目标?
答案 0 :(得分:0)
基本上 - 你不能。 XAML 2009支持传递构造函数参数,但根据MSDN,这不适用于WPF - 至少不是您描述的方式。它可以在稍后包含的XAML文件中,但不在编译文件中,因此我认为它不适用于设计器。
为什么不能创建无参数构造函数并将属性更改为具有公共setter?
如果没有充分的理由,那么可以为参数创建一个虚拟持有类,并使用ValueConverter将ItemsSource绑定到这些虚拟类的集合,从虚拟类转到所需的类。这样您就可以在代码中构造并使用参数化构造函数。