2010-04-09 20 views
15

Ich versuche, den Namen der Eigenschaft mit einem bestimmten DataGridColumn verbunden zu bekommen, so dass ich dann einige Sachen basierend darauf tun kann. Diese Funktion wird aufgerufen, wenn der Benutzer im Spaltenkopf auf den Kontextmenüeintrag klickt.WPF - So binden Sie eine DataGridTemplateColumn

Dies ist für die sofort einsatzbereiten Spaltentypen wie DataGridTextColumn in Ordnung, da sie gebunden sind, aber das Problem ist, dass einige meiner Spalten DataGridTemplateColumns sind, die nicht gebunden sind.

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

Also, nehmen Sie zum Beispiel meine Name Spalte ... es ist ein DataGridTemplateColumn (da es ein Bild und einige andere Sachen drin hat). Daher ist es nicht wirklich an die Eigenschaft 'Name' gebunden ... aber ich möchte es sein, damit der obige Code funktioniert.

Meine Frage ist zweigeteilt, wirklich:

  1. Ist es möglich, so zu machen, wird ein DataGridTemplateColumn BOUND, dass der obige Code funktionieren würde? Kann ich es irgendwie an eine Eigenschaft binden?

  2. Oder brauche ich etwas ganz anderes, und ändern Sie den obigen Code?

Vielen Dank im Voraus!

AT

Antwort

0
  1. Nein, denn DataGridTemplateColumn nicht von DataGridBoundColumn nicht erben, so die Besetzung zu DataGridBoundColumn scheitern würde.
    Um obigen Code arbeiten zu können, müssen alle Spalten von DataGridBoundColumn abstrakte Klasse erben. Daher sollten benutzerdefinierte abgeleitete Spaltenklassen anstelle von DataGridTemplateColumn funktionieren.

  2. könnten Sie einfach füllen Sie eine

    Dictionary<DataGridColumn, string> BoundPropName;

    bei der Initialisierung und dann

    var propName = BoundPropName[dgch.Column]

2

tun Es ist eine knifflige Frage. Wir haben die Bindung erreicht, indem wir zu seinem Großeltern UserControl gegangen sind (wir hatten DataGrid in einem UserControl) und das UserControl war an einen Presenter gebunden (Model in unserem Fall). Überprüfen Sie im folgenden Code die Eigenschaft SelectedItem von AutoCompleteBox, die in der DataGridTemplateColumn platziert ist.

<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

können Sie dgbc.ClipboardContentBinding;

25

verwenden Auch wenn Sie nicht eine Vorlage Spalte binden kann, eine der gehaltenen Kontrollen in dieser Spalte binden kann.Dies ist, wie ich ein ähnliches Problem gelöst:

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

Wenn ich das anfängliche Beispiel richtig verstanden habe, würde dies bedeuten, die Logik der GroupByField_Click() Methode Wechsel zu prüfen, ob der sendende Spalt eine Vorlagenspalte war und dann betrachten die Elemente, die es enthielt, um das Binding-Objekt zu erhalten.

2

Für mich ClipboardContentBinding von DataGridTemplateColumn ist eine Lösung:

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 
Verwandte Themen