WPF - Как связать DataGridTemplateColumn - PullRequest
18 голосов
/ 09 апреля 2010

Я пытаюсь получить имя свойства, связанного с конкретным 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. Или мне нужно что-то совершенно другое, и изменить код выше?

Заранее спасибо!

AT

Ответы [ 5 ]

31 голосов
/ 03 декабря 2010

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

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

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

3 голосов
/ 10 октября 2012

Для меня ClipboardContentBinding из 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
2 голосов
/ 14 мая 2010

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

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

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

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

    Dictionary<DataGridColumn, string> BoundPropName;

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

    var propName = BoundPropName[dgch.Column]

...