Использование Canvas с несколькими привязками данных (и разными фигурами)

Я разрабатываю приложение WPF с использованием шаблона MVVM. В моем приложении у меня есть холст, который должен отображать несколько разных форм. Эти формы описывают склад (он же хранилище) и содержимое склада.

Для отображения только склад (который описывается 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с Circleпока Officeс Rectangleс).

1 ответ

Поскольку вы не можете использовать один Canvas в качестве ItemsPanel для нескольких ItemsControls, вы можете найти способ превратить их в один список, по крайней мере, в узлы и офисы. Вы можете попытаться найти для них абстракцию или использовать объект.

Теперь у вас есть 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

Надеюсь, это поможет.

Другие вопросы по тегам