views:

45

answers:

1

Hi. We need to dynamically create (i.e. during runtime, via code-behind) UserControls and position them on a Canvas. We want to bind the position (Canvas.Left and Canvas.Top) and width of those sizable (!) and draggable (!) UserControls to a ObservableCollection<>. That measn when the user drags or resizes the control, the datasource gets automatically updated.

How would we achieve this if the Usercontrol is contained in a DataTemplate which in turn is used by a ListBox whose DataContext is set to the collection we want to bind to?

In other words, how do we bind a control's position and size that doesn't exist in XAML, but in code only (because it's created by clicking and dragging the mouse)?

Notice that the collection can be empty or not empty, meaning that the size and position stored in datasource must be correctly bound to so that the UserControl can be sized and positioned correctly in the Canvas - via DataBinding. Is this possible?

A: 

Have you tried using a Mode=TwoWay binding?

<YourUserControl 
    Canvas.Top="{Binding TopProperty, Mode=TwoWay}" 
    Canvas.Left={Binding LeftProperty, Mode=TwoWay}" 
    Height="{Binding HeightProperty, Mode=TwoWay}" 
    Width="{Binding WidthProperty, Mode=TwoWay}" />

I'm not convinced two-way binding will work with resize or drag and drop operations, but there's only one way to find out.

CMerat
Thanks for your help.This is interesting. What is the TopProperty or LeftProperty in the Binding in your example? Is that the Canvas.Left and Canvas.Top or the UserControl.Left and USerControl.Top?I haven't been able to make this work yet, let alone TwoWay binding.
John
After some more trial and error this actually works. TwoWay will take care of the the datasource when the mosue moves or resizes the UserControl. Thanks!!
John
TopProperty and LeftProperty are the properties on your datasource that you want to keep in sync. Glad to hear it worked out!
CMerat