I am trying to get the name of the property associated with a particular DataGridColumn
, so that I can then do some stuff based on that. This function is called whe
It's a tricky one. We achieved the binding by traversing to its grandparent UserControl (we had DataGrid inside a UserControl) and the UserControl was bound to a Presenter (Model in our case). In the code below, check the property SelectedItem of AutoCompleteBox placed inside the DataGridTemplateColumn.
<wpfToolkit:DataGridTemplateColumn Header="{x:Static resources:Store.ItemNameC}" Width="0.60*">
<wpfToolkit:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<extended:HOAutoCompleteBox
IsTextCompletionEnabled ="True"
x:Name="ItemAutoCompleteBox"
Populating="ItemAutoCompleteBox_Populating"
DefaultType="HealthObject.ObjectModel.pSearchStockItemResult,HealthObject.ObjectModel"
Text="{Binding Path= ItemName, Mode=TwoWay}"
<!--- **** HERE IS THE BINDING SAMPLE *****-->
SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=Model.SelectedStockItem, Mode=TwoWay}">
</extended:HOAutoCompleteBox>
</DataTemplate>
</wpfToolkit:DataGridTemplateColumn.CellEditingTemplate>
</wpfToolkit:DataGridTemplateColumn>
You may use
dgbc.ClipboardContentBinding;
For me, ClipboardContentBinding
of DataGridTemplateColumn
is a solution:
Private Function FindBoundProperty(ByVal col As DataGridColumn) As String
Dim boundColumn As DataGridBoundColumn = TryCast(col, DataGridBoundColumn)
Dim boundPropertyName As String = ""
Dim binding As Binding
If col.DependencyObjectType.Name = "DataGridTextColumn" Then
binding = TryCast(boundColumn.Binding, Binding)
boundPropertyName = binding.Path.Path
End If
If col.DependencyObjectType.Name = "DataGridTemplateColumn" Then
binding = TryCast(col.ClipboardContentBinding, Binding)
boundPropertyName = binding.Path.Path
End If
Return boundPropertyName
End Function
Although you can't bind a template column, you can bind one of the controls held in that column. This is how I solved a similar problem:
<DataGridTemplateColumn Header="ColumnHeader">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<local:CustomisedUIElement Text="{Binding Path=PropertyToBindTo}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
If I've understood the initial example properly, this would mean changing the logic of the GroupByField_Click()
method to check whether the sending column was a template column and then looking at the elements it contained to obtain the Binding object.
No, because DataGridTemplateColumn
doesn't inherit from DataGridBoundColumn
, so the cast to DataGridBoundColumn
would fail.
To make above code work all of your columns must inherit from DataGridBoundColumn
abstract class. So making custom derived Column classes instead of DataGridTemplateColumn
should work.
You could simply populate a
Dictionary<DataGridColumn, string> BoundPropName;
on initialization and then do
var propName = BoundPropName[dgch.Column]