Привязка 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>

Кстати, я нашел решение на этом вопросе, после того как я попробовал предложение Анваки, где привязка не работала.

Надеюсь, это поможет другим, ища тот же ответ.