我正在使用MVVM模式开发WPF应用程序。在我的应用程序中,我有一个画布应该显示几种不同的形状。这些形状描述了仓库(a.k.a存储)和仓库内容。
要仅显示仓库(由ObservableCollection<Point>
描述),请使用以下代码段
<Canvas Width="{Binding StorageWidth, Mode=OneWay}" Height="{Binding StorageHeight, Mode=OneWay}">
<Polygon Points="{Binding StorageVertices, Mode=OneWay, Converter={StaticResource PointCollectionConverter}}" Stroke="Gray" StrokeThickness="30">
<Polygon.Fill>
<SolidColorBrush Color="DarkRed" Opacity="0.25" />
</Polygon.Fill>
</Polygon>
</Canvas>
对于这个画布,我想添加矩形(用于描述存储中的办公室)和圆圈(用于描述存储中的节点)。这些在我的视图模型中定义:
class Node
{
// ...
Point Position { get; private set; }
}
class Office
{
// ...
ObservableCollection<Point> Vertices { get; private set; }
}
public class ViewModel : ViewModelBase
{
// ...
ObservableCollection<Node> Nodes { get; private set; }
ObservableCollection<Office> Offices { get; private set; }
ObservableCollection<Point> StorageVertices { get; private set; } // Already displayed on the canvas
}
如何使用数据绑定在画布上以及存储区域中显示这些内容?我知道我可以正常使用ItemsControl
,但现在我有几个不同的集合/来源,它们应该以不同的方式描述(Node
s是Circle
s而Office
1}} s是Rectangle
s)。
答案 0 :(得分:1)
由于您不能将一个Canvas用作ItemsPanel用于多个ItemsControls,您可能会找到一种方法将它们组合成一个List,至少是Nodes和Offices。您可能会尝试为它们找到抽象或使用Object。
现在你有一个带有存储的ObservableCollection。您可以使用带有Canvas的ItemsControl作为ItemsPanel,使用DataTemplate在其上绘制所有节点和办公室。接下来是添加存储。我认为你有两个选择,也许其他人有更好的选择,或者将它放入列表中并添加另一个DataTemplate或编写自定义的Canvas,公开绑定到存储的依赖属性并覆盖OnManipulationDelta方法。坦率地说,我从未尝试过第二次,也不能说它会起作用,但你可以参考这篇文章了解详情:http://blogs.msdn.com/b/mim/archive/2013/04/16/winrt-create-a-custom-itemspanel-for-an-itemscontrol.aspx
希望它会有所帮助。