WPF - How to bind a DataGridTemplateColumn

后端 未结 5 677
予麋鹿
予麋鹿 2021-02-05 07:07

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

相关标签:
5条回答
  • 2021-02-05 07:14

    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>
    
    0 讨论(0)
  • 2021-02-05 07:17

    You may use dgbc.ClipboardContentBinding;

    0 讨论(0)
  • 2021-02-05 07:19

    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
    
    0 讨论(0)
  • 2021-02-05 07:20

    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.

    0 讨论(0)
  • 2021-02-05 07:33
    1. 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.

    2. You could simply populate a

      Dictionary<DataGridColumn, string> BoundPropName;

      on initialization and then do

      var propName = BoundPropName[dgch.Column]

    0 讨论(0)
提交回复
热议问题