In my WPF application I have a Canvas in which I do some drawing. Earlier I handled the drawing in the code behind, but now I've factored everything out to a ViewModel. This gives me some challenges..
I have a few InkPresenter objects holding Strokes. Earier I added them as children to the Canvas in the code behind - like this:
// Build an InkPresenter:
var someInkPresenter = BuildInkPresenter(..);
//_myCanvas is the <Canvas> I want to display it in:
_myCanvas.Children.Add(someInkPresenter);
Now - not building the InkPresenter in the code-behind of the XAML that holds _myCanvas I need to do this differently. What I'd like to do is to create an InkPresenter and add it to a collection:
public ObservableCollection<InkPresenter> Drawings;
My problem now is how to bind the Canvas to this ObservableCollection - and have the InkPresenters displayed when added to the collection. Can I achieve this using Data Bindings somehow?
I think you can do this with ItemsControl + ItemsPanelTemplate. Like this:
<ItemsControl ItemsSource="{Binding YourCollection}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
To read more about this approach refer to Dr.WPF: ItemsControl: A to Z (P is for Panel)
The solution Anvaka suggested is great, but as John Bowen pointed out you need to know a bit more, if you would like to actually bind your items to the Canvas attached properties.
Here's an example on how to bind to Canvas.Left and 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>
</ItemsControl>
Btw, I found the solution on this question, after I tried Anvaka's suggestion, where the binding didn't work.
Hopefully this helps others, looking for the same answer.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With