WPF-如何绑定datagridtemplatecolumn[英] WPF - How to bind a DataGridTemplateColumn

本文是小编为大家收集整理的关于WPF-如何绑定datagridtemplatecolumn的处理方法,想解了WPF-如何绑定datagridtemplatecolumn的问题怎么解决?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列为例...它是DataGridTemplateColumn(因为它有图像和其他一些东西).因此,它实际上没有绑定到"名称"属性...但是我想成为,以便上述代码可以正常工作.

我的问题是两部分,实际上是:

  1. 是否可以将DataGridTemplateColumn绑定,以便上述代码可以工作?我可以以某种方式将其绑定到属性吗?

  2. 或我需要完全不同的东西,然后更改上述代码?

预先感谢!

at

推荐答案

尽管您无法绑定模板列,但您可以绑定该列中持有的控件之一.这就是我解决类似问题的方式:

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

如果我正确理解了初始示例,这将意味着更改GroupByField_Click()方法的逻辑以检查发送列是否是模板列,然后查看其所包含的元素以获得绑定对象.<<<<<<<<<<<<<<

其他推荐答案

这是一个棘手的.我们通过遍历其祖父母的Usercontrol(我们的usercontrol中有数据杂志)来实现约束力,而UserControl则与演示者(在我们的案例中)绑定. 在下面的代码中,检查放置在DataGridTemplateColumn内的AutoCompletebox的属性.

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

其他推荐答案

对我来说,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

本文地址:https://www.itbaoku.cn/post/1794105.html