使用Canvas具有多个数据绑定(和不同的形状)

时间:2013-07-09 12:11:28

标签: c# wpf mvvm wpf-controls mvvm-foundation

我正在使用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)。

1 个答案:

答案 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

希望它会有所帮助。