斯科特非常接近,但并不完全在那里;设置 Grid 的 DataContext 不会呈现包含的 Circle 对象。您需要的是一个嵌入式控件,它可以呈现自己的项目,然后将该控件的 ItemsSource 属性绑定到 CircleList。
我已经使用您的原始类构建了一个示例来演示这一点。下面是代码隐藏:
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
Square square = new Square();
square.CircleList = new List<Circle>() { new Circle(25) };
_shapes.Add(square);
}
private List<Shape> _shapes = new List<Shape>();
public List<Shape> Shapes
{
get { return _shapes; }
}
}
public abstract class Shape { }
public class Circle : Shape
{
public double Diameter { get; private set; }
public Circle(double diameter)
{
Diameter = diameter;
}
}
public class Square : Shape
{
public List<Circle> CircleList { get; set; }
}
所以你可以看到我在我的 Shapes 列表中添加了一个 Square,其中包含一个直径为 25 的圆。请注意,这不会添加对使用绝对坐标定位形状的任何支持;我假设您已经为此做好了准备。
现在是 XAML:
<Window x:Class="TestWpfApplication.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestWpfApplication"
Title="Window1"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Window.Resources>
<DataTemplate DataType="{x:Type local:Circle}">
<Ellipse Stroke="Black"
Width="{Binding Diameter}"
Height="{Binding Diameter}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:Square}">
<Border BorderThickness="1" BorderBrush="Black">
<ItemsControl ItemsSource="{Binding CircleList}"/>
</Border>
</DataTemplate>
</Window.Resources>
<ListBox ItemsSource="{Binding Shapes}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<Canvas/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
这是您的数据模板;您可以看到 Circle 是用 Ellipse 简单呈现的。另一方面,Square 有一个嵌入的 ItemsControl,用于呈现其包含的项目。我还在它周围画了一个边框来制作方形。
结果如下:
替代文字 http://img212.imageshack.us/img212/8658/squarewithcirclecontent.png