2010-04-09 13 views
15

Próbuję uzyskać nazwę właściwości związanej z konkretną DataGridColumn, tak że mogę następnie zrobić pewne rzeczy na podstawie tego. Ta funkcja jest wywoływana, gdy użytkownik kliknie pozycję menu kontekstowego w nagłówku kolumny ...WPF - jak powiązać DataGridTemplateColumn

Jest to przydatne w przypadku gotowych, gotowych typów kolumn, takich jak DataGridTextColumn, ponieważ są one związane, ale problem jest to, że niektóre z moich kolumn są DataGridTemplateColumns, które nie są związane.

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

Więc Weźmy na przykład mój Name kolumnę ... to DataGridTemplateColumn (ponieważ ma obraz i kilka innych rzeczy w tam). Dlatego nie jest w rzeczywistości związany z właściwością "Nazwa" ... ale chciałbym być, aby powyższy kod działał.

Moje pytanie jest dwuczęściowa, naprawdę:

  1. Czy to możliwe, aby DataGridTemplateColumn związanie tak, że powyższy kod będzie działać? Czy mogę jakoś powiązać to z nieruchomością?

  2. Czy potrzebuję czegoś zupełnie innego i zmienić powyższy kod?

Z góry dziękuję!

AT

Odpowiedz

0
  1. Nie, ponieważ DataGridTemplateColumn nie dziedziczą DataGridBoundColumn, więc obsada do DataGridBoundColumn zawiedzie. Aby wykonać powyższy kod, wszystkie kolumny muszą dziedziczyć po klasie abstrakcji
    . W związku z tym tworzenie niestandardowych klas kolumnowych zamiast DataGridTemplateColumn powinno działać.

  2. Można po prostu wypełnić

    Dictionary<DataGridColumn, string> BoundPropName;

    na inicjalizacji, a następnie wykonaj

    var propName = BoundPropName[dgch.Column]

2

To jest podchwytliwe. Osiągnęliśmy wiązanie przechodząc do jego dziadka UserControl (mieliśmy DataGrid wewnątrz UserControl), a UserControl był związany z Presenterem (Model w naszym przypadku). W poniższym kodzie zaznacz właściwość SelectedItem of AutoCompleteBox umieszczoną wewnątrz 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> 
25

Chociaż nie można powiązać kolumnę szablonu, można powiązać jednego z parametrów przechowywanych w tej kolumnie.W ten sposób mam rozwiązać podobny problem:

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

Jeśli mam rozumieć początkowy przykład prawidłowo, to oznaczałoby zmianę logiki metody GroupByField_Click(), by sprawdzić, czy kolumna wysyłania była kolumna szablon, a następnie patrząc na elementy zawarte w celu uzyskania obiektu wiążącego.

2

Dla mnie ClipboardContentBinding z DataGridTemplateColumn to rozwiązanie:

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 
Powiązane problemy