data c# wpf binding datagrid datagridtemplatecolumn

c# - datagrid wpf binding



WPF-Cómo enlazar una DataGridTemplateColumn (5)

Puede usar dgbc.ClipboardContentBinding;

Estoy tratando de obtener el nombre de la propiedad asociada con una DataGridColumn particular, para poder hacer algunas cosas en base a eso. Se llama a esta función cuando el usuario hace clic en el elemento del menú contextual en el encabezado de la columna ...

Esto está bien para los tipos de columna listos para usar listos para DataGridTextColumn , como DataGridTextColumn , ya que están vinculados, pero el problema es que algunas de mis columnas son DataGridTemplateColumns , que no están vinculadas.

private void GroupByField_Click (object sender, RoutedEventArgs e){ MenuItem mi = (MenuItem)sender; ContextMenu cm = (ContextMenu) mi.Parent; DataGridColumnHeader dgch = (DataGridColumnHeader) cm.PlacementTarget; DataGridBoundColumn dgbc = (DataGridBoundColumn) dgch.Column; Binding binding = (Binding) dgbc.Binding; string BoundPropName = binding.Path.Path; //Do stuff based on bound property name here... }

Por lo tanto, tome como ejemplo mi columna Name ... es una DataGridTemplateColumn (ya que tiene una imagen y algunas otras cosas allí). Por lo tanto, en realidad no está vinculado a la propiedad ''Nombre'' ... pero me gustaría serlo, de modo que el código anterior funcione.

Mi pregunta es en dos partes, realmente:

  1. ¿Es posible hacer que una DataGridTemplateColumn sea ​​BOUND, para que el código anterior funcione? ¿Puedo vincularlo de alguna manera a una propiedad?

  2. ¿O necesito algo completamente diferente y cambiar el código anterior?

¡Gracias por adelantado!

A


  1. No, porque DataGridTemplateColumn no hereda de DataGridBoundColumn , por lo que la conversión a DataGridBoundColumn fallará.
    Para que el código anterior funcione, todas sus columnas deben heredar de la clase abstracta DataGridBoundColumn . Por lo tanto, debería funcionar crear clases de columna derivadas personalizadas en lugar de DataGridTemplateColumn .

  2. Podrías simplemente poblar un

    Dictionary<DataGridColumn, string> BoundPropName;

    en la inicialización y luego hacer

    var propName = BoundPropName[dgch.Column]


Aunque no puede enlazar una columna de plantilla, puede enlazar uno de los controles contenidos en esa columna. Así es como resolví un problema similar:

<DataGridTemplateColumn Header="ColumnHeader"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <local:CustomisedUIElement Text="{Binding Path=PropertyToBindTo}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn>

Si he entendido correctamente el ejemplo inicial, esto significaría cambiar la lógica del método GroupByField_Click() para verificar si la columna de envío era una columna de plantilla y luego mirar los elementos que contiene para obtener el objeto de enlace.


Para mí, ClipboardContentBinding de DataGridTemplateColumn es una solución:

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


Es complicado. Logramos el enlace atravesando a su abuelo UserControl (teníamos DataGrid dentro de un UserControl) y UserControl estaba vinculado a un Presenter (Modelo en nuestro caso). En el siguiente código, verifique la propiedad SelectedItem de AutoCompleteBox ubicada dentro de 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>