Извините, у меня нет решения вашей конкретной пользовательской проблемы Grid
, но у меня есть только предложение, как вы могли бы сделать это проще (и, я полагаю, как это понимается дизайнерами WPF). На самом деле, Grid
- это не элемент управления для размещения предметов . Это Panel
, который устраивает Controls
. Итак, я полагаю, что это одна из причин, по которой у вас возникли проблемы с вашим решением.
Вместо этого я бы использовал ItemsControl
(например, ListBox
) с Canvas
как ItemsPanel
.
<ListBox ItemsSource="{Binding WorkItemsProperty}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<Canvas IsItemsHost="True"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
Теперь вы определяете соответствующие свойства в своем классе WorkItem
(или WorkItemViewModel
), например XPos
и YPos
, которые будут привязаны к свойствам Canvas.Left
и Canvas.Top
, например:
<Style x:Key="WorkItemStyle" TargetType="{x:Type ListBoxItem}">
<Setter Property="Canvas.Left" Value="{Binding XPos, Mode=TwoWay}"/>
<Setter Property="Canvas.Top" Value="{Binding YPos, Mode=TwoWay}"/>
</Style>
Затем вы можете использовать этот стиль элемента, назначив ItemContainerStyle
свойство ListBox
:
ItemContainerStyle="{StaticResource WorkItemStyle}"
Я не знаю, как реализовать перетаскивание, потому что я никогда не делал этого, но, очевидно, вы уже сделали это для своего пользовательского Grid
, поэтому не должно быть большой проблемой использовать его в ListBox
. Однако если вы обновите свойства вашего WorkItem
, он должен автоматически переместить элемент. Кроме того, если вы добавляете / удаляете элемент в / из вашей коллекции (WorkItemsProperty
), он будет автоматически добавлен / удален, поскольку ListBox
привязан к данным для коллекции.
Возможно, вам придется изменить WorkItemStyle
в зависимости от вашего сценария. Например, если размер ListBox изменяется во время выполнения, вам может потребоваться сделать позиции относительно размера контейнера (Canvas '). Следовательно, вам понадобится MultiBinding
вместо простого Binding
. Но это другая история ...
Теперь вы сами решаете, можете ли вы все-таки перейти на этот подход, или ваш Grid
почти закончен, и вы не готовы измениться. Я знаю, что это сложно, но на мой взгляд, вышеупомянутый подход является более чистым (и более легким!)!