質問
これをレンダリングする方法に頭を包むことはできません
public class Shape{}
public class Circle: Shape{}
public class Square: Shape
{
public List<Circle> CircleList{ get; private set; }
}
Shapeオブジェクトを保持するリストがありますが、ここで達成したいのは、各オブジェクトをグリッドにレンダリングすることです。
オブジェクトがSquareの場合、CircleListプロパティのCircleアイテムを保持するネストされたグリッドが必要です
ItemsControlとHierarchicalDataTemplateを試してみましたが、機能しませんでした。ItemsControl内にItemsControlをネストしようとしました。WPFが初めてなので、 「適切」解決策になります。 TreeViewで上記を何とかレンダリングしましたが、達成しようとしているのは、図形をレンダリングする描画ボードです。
更新
「ドローイングボード」アイテムを含める必要があり、各アイテムはコンテナでレンダリングする必要があります。
オブジェクトのタイプがSquareの場合、Squareコンテナには、CircleListプロパティのCircleオブジェクトを保持するネストされたコンテナが必要です。
解決
Scottはかなり近いですが、まったくではありません。グリッドの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; }
}
これで、直径25の円を含む1つの正方形がシェイプリストに追加されたことがわかります。これは、絶対座標を使用したシェイプの配置のサポートを追加しないことに注意してください。そのための準備が既に整っていると思います。
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>
DataTemplatesは次のとおりです。円が単に楕円でレンダリングされていることがわかります。一方、Squareには、含まれているアイテムをレンダリングするItemsControlが埋め込まれています。また、四角い形を作るためにその周りにボーダーを描きました。
結果は次のとおりです。
代替テキストhttp://img212.imageshack.us/img212/8658/squarewithcirclecontent .png
他のヒント
2つのDataTemplatesを使用してみてください。1つは円用(1つは円をレンダリングする)、もう1つは正方形用です。 Square DataTemplateは、グリッドをレンダリングして(正方形に見えるように境界線を付けるだけ)、ネストされたグリッドのDataContext =&quot; {Binding CircleList}&quot;を設定します。
シェイプのリストをグリッドに変換する方法が100%確実ではありませんが、すでに解決済みのように聞こえますので、簡単にするために省略します。 :)