Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I reference an attached property as the source of a data binding?

Here's a much-abbreviated sample of my code.

<Grid>

<Polygon
  Name="ply" Grid.Column="2" Grid.Row="0" Grid.RowSpan="3"
  Fill="Orange" Stroke="Orange" Points="0,1 1,3 2,2 2,0 0,0"
/>

<Line
  Grid.Column=    "{Binding ElementName=ply, Path=Grid.Column, Mode=OneWay}"
  Grid.Row=       "{Binding ElementName=ply, Path=Grid.Row, Mode=OneWay}"
  Grid.ColumnSpan="{Binding ElementName=ply, Path=Grid.ColumnSpan, Mode=OneWay}"
  Grid.RowSpan=   "{Binding ElementName=ply, Path=Grid.RowSpan, Mode=OneWay}"
  X1="0" Y1="0" X2="1" Y2="1"
/>

</Grid>

The code compiles just fine, without any errors or warnings - but when I run the application, this appears in the output window:

System.Windows.Data Error: 39 : BindingExpression path error:
'Grid' property not found on 'object' ''Polygon' (Name='ply')'.
BindingExpression:Path=Grid.Column; DataItem='Polygon' (Name='ply');
target element is 'Line' (Name=''); target property is 'Column' (type 'Int32')

System.Windows.Data Error: 39 : BindingExpression path error:
'Grid' property not found on 'object' ''Polygon' (Name='ply')'.
BindingExpression:Path=Grid.Row; DataItem='Polygon' (Name='ply');
target element is 'Line' (Name=''); target property is 'Row' (type 'Int32')

System.Windows.Data Error: 39 : BindingExpression path error:
'Grid' property not found on 'object' ''Polygon' (Name='ply')'.
BindingExpression:Path=Grid.ColumnSpan; DataItem='Polygon' (Name='ply');
target element is 'Line' (Name=''); target property is 'ColumnSpan' (type 'Int32')

System.Windows.Data Error: 39 : BindingExpression path error:
'Grid' property not found on 'object' ''Polygon' (Name='ply')'.
BindingExpression:Path=Grid.RowSpan; DataItem='Polygon' (Name='ply');
target element is 'Line' (Name=''); target property is 'RowSpan' (type 'Int32')

I'm clearly not doing this correctly, so my question is:
How do I properly reference the attached property "Grid.Whatever" on the source element in my data-binding? Am I going to have to perform the binding in the code-behind instead, or will a XAML binding with different syntax be sufficient?

like image 473
Giffyguy Avatar asked Sep 11 '09 02:09

Giffyguy


1 Answers

You are going to laugh, but it's just slightly different syntax. You just need to put parenthesis around the attached property name (this took me forever to figure out the first time I did it):

<Line
  Grid.Column=    "{Binding ElementName=ply, Path=(Grid.Column), Mode=OneWay}"
  Grid.Row=       "{Binding ElementName=ply, Path=(Grid.Row), Mode=OneWay}"
  Grid.ColumnSpan="{Binding ElementName=ply, Path=(Grid.ColumnSpan), Mode=OneWay}"
  Grid.RowSpan=   "{Binding ElementName=ply, Path=(Grid.RowSpan), Mode=OneWay}"
  X1="0" Y1="0" X2="1" Y2="1"
/>

Hope this helps, Anderson

like image 51
Anderson Imes Avatar answered Oct 05 '22 06:10

Anderson Imes