Использование 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
Надеюсь, это поможет.