2010-04-09 3 views
15

Sto cercando di ottenere il nome della proprietà associata a un particolare DataGridColumn, in modo che possa quindi fare alcune cose basate su quello. Questa funzione viene chiamata quando l'utente fa clic sulla voce di menu contestuale sull'intestazione della colonna ...WPF - Come associare un DataGridTemplateColumn

Questo va bene per i tipi di colonna già pronti pronte all'uso come DataGridTextColumn, poiché sono vincolati, ma il problema è che alcune delle mie colonne sono DataGridTemplateColumns, che non sono vincolate.

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... 
    } 

Quindi, prendete per esempio la mia rubrica Name ... si tratta di un DataGridTemplateColumn (dal momento che ha un'immagine e alcune altre cose in là). Pertanto, non è in realtà legato alla proprietà 'Nome' ... ma mi piacerebbe esserlo, in modo che il codice sopra funzionerà.

La mia domanda è in due parti, in realtà:

  1. E 'possibile fare una DataGridTemplateColumn essere vincolato, in modo che il codice di cui sopra avrebbe funzionato? Posso legarlo in qualche modo a una proprietà?

  2. Oppure ho bisogno di qualcosa di completamente diverso e modificare il codice sopra?

Grazie in anticipo!

AT

risposta

0
  1. No, perché DataGridTemplateColumn non eredita da DataGridBoundColumn, in modo che il cast DataGridBoundColumn fallirebbe.
    Per eseguire il codice sopra, tutte le colonne devono ereditare dalla classe astratta DataGridBoundColumn. Pertanto, è consigliabile creare classi di colonne derivate personalizzate anziché DataGridTemplateColumn.

  2. Si potrebbe semplicemente compilare un

    Dictionary<DataGridColumn, string> BoundPropName;

    su inizializzazione e poi fare

    var propName = BoundPropName[dgch.Column]

2

E 'un ingannevole. Abbiamo raggiunto l'associazione passando al suo nonno UserControl (avevamo DataGrid all'interno di un UserControl) e l'UserControl era legato a un Presenter (Modello nel nostro caso). Nel seguente codice, selezionare la proprietà SelectedItem di AutoCompleteBox inserito all'interno di 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

È possibile utilizzare dgbc.ClipboardContentBinding;

25

Anche se non è possibile associare una colonna modello, è possibile associare uno dei controlli detenute in quella colonna.Questo è come ho risolto un problema simile:

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

Se ho capito l'esempio iniziale correttamente, questo significherebbe cambiare la logica del metodo GroupByField_Click() per verificare se la colonna di invio è stato una colonna modello e poi guardando gli elementi contenuti per ottenere l'oggetto Binding.

2

Per me, ClipboardContentBinding di DataGridTemplateColumn è una soluzione:

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