Привязка WPF Canvas Children к наблюдаемому набору
В моем приложении WPF у меня есть холст, в котором я рисую рисунок. Раньше я обрабатывал чертеж в коде позади, но теперь я все рассмотрел в ViewModel. Это дает мне некоторые проблемы.
У меня есть несколько объектов InkPresenter, содержащих Strokes. Раньше я добавил их как детей на холст в коде позади - вот так:
// Build an InkPresenter:
var someInkPresenter = BuildInkPresenter(..);
//_myCanvas is the <Canvas> I want to display it in:
_myCanvas.Children.Add(someInkPresenter);
Теперь, не создавая InkPresenter в коде XAML, который содержит _myCanvas, мне нужно сделать это по-другому. Я бы хотел создать InkPresenter и добавить его в коллекцию:
public ObservableCollection<InkPresenter> Drawings;
Теперь моя проблема заключается в том, как привязать Canvas к этому ObservableCollection - и при добавлении в коллекцию отобразятся InkPresenters. Могу ли я добиться этого, используя Data Bindings?
Ответы
Ответ 1
Я думаю, вы можете сделать это с помощью ItemsControl + ItemsPanelTemplate. Вот так:
<ItemsControl ItemsSource="{Binding YourCollection}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
Чтобы узнать больше об этом подходе, обратитесь к Dr.WPF: ItemsControl: от A до Z (P для панели)
Ответ 2
Решение, предложенное Анвакой, велико, но, как указал Джон Боуэн, вам нужно знать немного больше, если вы хотите привязать свои предметы к прикрепленным свойствам Canvas.
Вот пример того, как привязываться к Canvas.Left и Canvas.Top:
<ItemsControl ItemsSource="{Binding YourCollection}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Canvas.Left" Value="{Binding YourModelLeft}" />
<Setter Property="Canvas.Top" Value="{Binding YourModelTop}" />
</Style>
</ItemsControl.ItemContainerStyle>
Кстати, я нашел решение на этом вопросе, после того как я попробовал предложение Анваки, где привязка не работала.
Надеюсь, это поможет другим, ища тот же ответ.