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:
¿Es posible hacer que una
DataGridTemplateColumn
sea BOUND, para que el código anterior funcione? ¿Puedo vincularlo de alguna manera a una propiedad?¿O necesito algo completamente diferente y cambiar el código anterior?
¡Gracias por adelantado!
A
No, porque
DataGridTemplateColumn
no hereda deDataGridBoundColumn
, por lo que la conversión aDataGridBoundColumn
fallará.
Para que el código anterior funcione, todas sus columnas deben heredar de la clase abstractaDataGridBoundColumn
. Por lo tanto, debería funcionar crear clases de columna derivadas personalizadas en lugar deDataGridTemplateColumn
.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>