[C#] DataGridTemplateColumn 바인딩하는 방법


Answers

템플릿 열을 바인딩 할 수는 없지만 해당 열에 포함 된 컨트롤 중 하나를 바인딩 할 수 있습니다. 이것이 내가 비슷한 문제를 해결 한 방법이다.

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

처음 예제를 제대로 이해했다면 GroupByField_Click() 메서드의 로직을 변경하여 보내는 열이 템플릿 열인지 확인한 다음 Binding 개체를 가져 GroupByField_Click() 위해 포함 된 GroupByField_Click() 수 있습니다.

Question

특정 DataGridColumn 과 관련된 속성의 이름을 얻으려고하므로 그 내용을 기반으로 몇 가지 작업을 수행 할 수 있습니다. 이 함수는 사용자가 열 헤더에서 컨텍스트 메뉴 항목을 클릭 할 때 호출됩니다.

DataGridTextColumn 과 같은 미리 준비된 기둥 형 열은 바인딩되어 있기 때문에 괜찮습니다. 그러나 문제는 내 열 중 일부가 바인딩되지 않은 DataGridTemplateColumns 라는 점입니다.

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

그래서, 예를 들어 내 Name 열을 가져 가라. DataGridTemplateColumn (이미지와 다른 것들이 거기에있다.). 따라서 실제로 'Name'속성에 바인딩되지는 않지만 ... 위와 같은 코드가 작동하도록하고 싶습니다.

내 질문은 두 부분으로 나뉜다.

  1. 위 코드가 작동 할 수 있도록 DataGridTemplateColumn 을 바인드 할 수 있습니까? 어떻게 든 재산에 묶을 수 있습니까?

  2. 아니면 완전히 다른 것을 필요로하고 위의 코드를 변경합니까?

미리 감사드립니다!

에서




dgbc.ClipboardContentBinding; 사용할 수 있습니다 dgbc.ClipboardContentBinding;




저에게 DataGridTemplateColumn ClipboardContentBinding 은 해결책입니다.

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



  1. DataGridTemplateColumnDataGridTemplateColumn 상속하지 않으므로 DataGridBoundColumn 캐스팅하지 못합니다.
    위의 코드가 작동하도록하려면 모든 열이 DataGridBoundColumn 추상 클래스에서 상속되어야합니다. 따라서 DataGridTemplateColumn 대신 사용자 지정 파생 Column 클래스를 만들어야합니다.

  2. 당신은 단순히

    Dictionary<DataGridColumn, string> BoundPropName;

    초기화 할 때

    var propName = BoundPropName[dgch.Column]




그것은 까다 롭습니다. 조부모 인 UserControl (우리는 UserControl 내부에 DataGrid가 있음)을 통과하고 UserControl이 Presenter (이 경우에는 Model)에 바인딩되어 바인딩을 수행했습니다. 아래 코드에서 DataGridTemplateColumn 안에있는 AutoCompleteBox의 SelectedItem 속성을 확인합니다.

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