WPF - 如何绑定 DataGridTemplateColumn

Posted

技术标签:

【中文标题】WPF - 如何绑定 DataGridTemplateColumn【英文标题】:WPF - How to bind a DataGridTemplateColumn 【发布时间】:2011-02-06 02:37:23 【问题描述】:

我正在尝试获取与特定 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(因为它有一张图片和其他一些东西)。因此,它实际上并没有绑定到“名称”属性......但我想这样做,这样上面的代码就可以工作了。

我的问题分为两部分,真的:

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

    或者我需要完全不同的东西,然后更改上面的代码吗?

提前致谢!

【问题讨论】:

【参考方案1】:

这是一个棘手的问题。我们通过遍历它的祖父 UserControl(我们在 UserControl 中有 DataGrid)实现了绑定,并且 UserControl 被绑定到了 Presenter(在我们的例子中是模型)。 在下面的代码中,检查放置在 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>

【讨论】:

【参考方案2】:

    不,因为DataGridTemplateColumn 不继承自DataGridBoundColumn,所以转换为DataGridBoundColumn 会失败。 要使上述代码正常工作,您的所有列都必须继承自 DataGridBoundColumn 抽象类。因此,制作自定义派生 Column 类而不是 DataGridTemplateColumn 应该可以工作。

    你可以简单地填充一个

    Dictionary&lt;DataGridColumn, string&gt; BoundPropName;

    初始化然后做

    var propName = BoundPropName[dgch.Column]

【讨论】:

【参考方案3】:

对我来说,ClipboardContentBindingDataGridTemplateColumn 是一个解决方案:

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

虽然您无法绑定模板列,但您可以绑定该列中的控件之一。这就是我解决类似问题的方法:

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

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

【讨论】:

【参考方案5】:

您可以使用 dgbc.ClipboardContentBinding;

【讨论】:

以上是关于WPF - 如何绑定 DataGridTemplateColumn的主要内容,如果未能解决你的问题,请参考以下文章

数据绑定如何避免 WPF 中的递归更新?

WPF:如何绑定到嵌套属性?

如何强制 WPF 绑定刷新?

如何在双向绑定组合框(WPF)上调用异步操作

WPF - 如何绑定 DataGridTemplateColumn

Wpf:如何从嵌套的 DataGrid 中绑定 SelectedItem