WPF - Как связать DataGridTemplateColumn

Я пытаюсь получить имя свойства, связанного с конкретным 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... it a DataGridTemplateColumn (так как у него есть изображение и некоторые другие вещи там). Поэтому он фактически не связан с свойством "Имя"... но я хотел бы быть таким, чтобы этот код работал.

Мой вопрос - двухчастный, действительно:

  • Можно ли сделать DataGridTemplateColumn BOUND, чтобы приведенный выше код работал? Можно ли каким-либо образом привязать его к свойству?

  • Или мне нужно что-то совершенно другое и изменить код выше?

Спасибо заранее!

в

Ответы

Ответ 1

Хотя вы не можете привязать столбец шаблона, вы можете связать один из элементов управления, хранящихся в этом столбце. Вот как я решил аналогичную проблему:

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

Если я правильно понял исходный пример, это означало бы изменение логики метода GroupByField_Click(), чтобы проверить, является ли столбец отправки столбцом шаблона, а затем просматривает элементы, которые он содержит для получения объекта Binding.

Ответ 2

Это сложный вопрос. Мы достигли привязки, перейдя к его прародителю UserControl (у нас был DataGrid внутри UserControl), и UserControl был связан с Ведущим (модель в нашем случае). В приведенном ниже коде проверьте свойство SelectedItem из AutoCompleteBox, помещенное внутри 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>

Ответ 3

Для меня ClipboardContentBinding of DataGridTemplateColumn является решением:

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

Ответ 4

Вы можете использовать dgbc.ClipboardContentBinding;

Ответ 5

  • Нет, потому что DataGridTemplateColumn не наследует от DataGridBoundColumn, поэтому сбрасывание в DataGridBoundColumn завершится неудачно.
    Чтобы сделать работу над кодом, все ваши столбцы должны наследоваться от абстрактного класса DataGridBoundColumn. Поэтому выполнение пользовательских классов столбцов вместо DataGridTemplateColumn должно работать.

  • Вы можете просто заполнить

    Dictionary<DataGridColumn, string> BoundPropName;

    при инициализации, а затем do

    var propName = BoundPropName[dgch.Column]