2010-04-09 22 views
15

Estoy tratando de obtener el nombre de la propiedad asociada con una determinada DataGridColumn, de modo que pueda entonces hacer algunas cosas en base a eso. Esta función se invoca cuando el usuario hace clic en el elemento del menú contextual en el encabezado de la columna ...WPF - Cómo enlazar un DataGridTemplateColumn

Esto está bien para los tipos de columnas listas para usar listas para usar 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... 
    } 

lo tanto, tomar, por ejemplo, mi columna Name ... es un DataGridTemplateColumn (ya que tiene una imagen y algunas otras cosas de 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 de dos partes, en realidad:

  1. ¿Es posible hacer una DataGridTemplateColumn obligarse, por lo que el código anterior podría trabajar? ¿Puedo vincularlo de alguna manera a una propiedad?

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

¡Gracias de antemano!

EN

Respuesta

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

  2. Simplemente podría llenar un

    Dictionary<DataGridColumn, string> BoundPropName;

    en la inicialización y luego hacer

    var propName = BoundPropName[dgch.Column]

2

Es un asunto difícil. 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, marque la propiedad SelectedItem de AutoCompleteBox colocado dentro de la 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> 
1

Es posible utilizar dgbc.ClipboardContentBinding;

25

Aunque no se puede obligar a una columna de plantilla, puede obligar a uno de los controles mantenidos en esa columna.Así es como he resuelto un problema similar:

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

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

2

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 
Cuestiones relacionadas