0

我正在使用 MVVM 模式开发 WPF 应用程序。在我的应用程序中,我有一个应该显示几种不同形状的画布。这些形状描述了一个仓库(又名存储)和仓库内容。

要仅显示仓库(由 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正常使用,但现在我有几个不同的集合/来源,它们应该以不同的方式描述(Nodes 是Circles 而Offices 是Rectangles)。

4

1 回答 1

1

由于您不能将一个 Canvas 用作多个 ItemsControl 的 ItemsPanel,因此您可能会找到一种方法将它们变成一个列表,至少是节点和办公室。您可能会尝试为它们找到抽象或使用 Object 代替。

现在你有了一个带有存储的 ObservableCollection。您可以使用 ItemsControl 和 Canvas 作为 ItemsPanel,使用 DataTemplate 在其上绘制所有节点和办公室。接下来是添加存储。我认为您有两个选择,也许其他人有更好的选择,要么将它也放入列表中并添加另一个 DataTemplate,要么编写您自定义的 Canvas,公开一个用于绑定到 Storage 的依赖属性并覆盖 OnManipulationDelta 方法。坦率地说,我从未尝试过第二次,也不能说它会起作用,但您可以参考这篇文章了解详细信息:http: //blogs.msdn.com/b/mim/archive/2013/04/16/winrt-create-a-custom -itemspanel-for-an-itemscontrol.aspx

希望它会有所帮助。

于 2013-07-09T13:04:49.827 回答