Darren Ng
Darren Ng

Reputation: 373

Binding in Code

I have a ScatterViewItem, which contains a UserControl. I'm trying to bind the MinWidth of the ScatterViewItem to the UserControl.

ScatterViewItem svi = new ScatterViewItem();
MyUserControl myUserControl = new MyUserControl();

//Make UC follow SVI's size. This code works.
myUserControl.SetBinding(UserControl.WidthProperty, svi.Width.ToString());
myUserControl.SetBinding(UserControl.HeightProperty, svi.Height.ToString());

//Make SVI follow UC's Min size. This doesn't work.
svi.SetBinding(ScatterViewItem.MinWidthProperty, myUserControl.MinWidth.ToString());
svi.SetBinding(ScatterViewItem.MinHeightProperty, myUserControl.MinHeight.ToString());

svi.Content = myUserControl;
myScatterView.Items.Add(svi);

Why is it that binding UC to SVI works and not the other way? How do I bind the MinWidth of the SVI to the UC then?

Upvotes: 0

Views: 138

Answers (2)

Roel van Westerop
Roel van Westerop

Reputation: 1440

The SetBinding method has 2 overloads (source: http://msdn.microsoft.com/en-us/library/ms598270(v=vs.110).aspx):

SetBinding(DependencyProperty, String)
SetBinding(DependencyProperty, BindingBase)

What you are trying to achieve by using the ToString() is not working, since the ToString() converts the value of the (Min)Width and (Min)Height properties to a string (for example 500.0 => "500.0"). The SetBinding overload that accepts a string as second parameter expects that string to be a property name or a path to the property.

What you probably want, is "MinWidth", "Width", "MinHeight" or "Height":

myUserControl.SetBinding(UserControl.WidthProperty, "Width");
myUserControl.SetBinding(UserControl.HeightProperty, "Height");

svi.SetBinding(ScatterViewItem.MinWidthProperty, "MinWidth");
svi.SetBinding(ScatterViewItem.MinHeightProperty, "MinHeight");

Edit: this is the correct version, using the other overload, since the previous piece of code doesn't know where to find the specified properties.

Binding widthBinding = new Binding("Width");
widthBinding.Source = myUserControl;
svi.SetBinding(ScatterViewItem.MinWidthProperty, widthBinding);

Binding heightBinding = new Binding("Height");
heightBinding.Source = myUserControl;
svi.SetBinding(ScatterViewItem.MinHeightProperty, heightBinding);

Upvotes: 1

J.H.
J.H.

Reputation: 4322

To bind your ScatterViewItem's MinWidth to your usercontrol's MinWidth, you need to create a binding with the source set to the usercontrol and path set to "MinWidth". This binding is then assigned to the ScatterViewItem with SetBinding.

// Create Binding
Binding b = new Binding("MinWidth");
b.Source = myUserControl;
// Assign Binding to ScatterViewItem
svi.SetBinding(ScatterViewItem.MinWidthProperty, b);

Upvotes: 1

Related Questions