Ваша модель представления вообще не должна ничего знать о физическом положении ваших карт, если вы правильно спроектировали свой вид.Вот довольно простой пример.Стили по умолчанию, которые я создал для TextBlock
и Border
, определяют, насколько они велики и (через отрицательное поле), как они перекрываются, когда они сложены вместе.ItemsControl
использует горизонтальный StackPanel
для макета.
Если вы примете этот подход, вы можете расположить элементы управления там, где они должны быть расположены в представлении (я, я бы использовал некоторую комбинациюпанели стыковки и поля для организации этого), и либо в вашей модели представления есть отдельная коллекция для каждого элемента управления, к которой привязывается элемент.
Возможно, это немного сложнее, но вы также можете иметь одну коллекциюобъекты карты и связывают каждый ItemsControl
ItemsSource
с CollectionView
, отфильтрованным по некоторому свойству карты.Приятно то, что вы можете «переместить» карту из одного места в другое, просто изменив значение этого свойства.
В любом случае вы увидите, что, как только вы возьмете на себя ответственность за элементы управлениядля управления макетом их содержимого вы можете свободно перемещать их в представлении, не касаясь модели представления.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<Style TargetType="TextBlock">
<Setter Property="Height" Value="150"/>
<Setter Property="Width" Value="100"/>
</Style>
<Style TargetType="Border">
<Setter Property="BorderBrush" Value="Black"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Background" Value="Lightgray"/>
<Setter Property="Margin" Value="0, 0, -80, 0"/>
</Style>
</Page.Resources>
<StackPanel>
<ItemsControl>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<Border>
<TextBlock Text="Foo"/>
</Border>
<Border>
<TextBlock Text="Bar"/>
</Border>
<Border>
<TextBlock Text="Baz"/>
</Border>
</ItemsControl>
</StackPanel>
</Page>