WPF - 如何绑定DataGridTemplateColumn

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(因为它里面有一些图片和其他东西)。因此,它实际上并没有绑定到'Name'属性...但我希望能够这样做,以便以上述代码能够工作。

我的问题实际上分为两个部分:

  1. 是否可以使DataGridTemplateColumn可以被绑定,以便以上述代码能够工作?我能否将其绑定到某个属性上?

  2. 或者我需要完全不同的方法,并改变上述代码?

提前感谢!

AT

5个回答

36

尽管你无法绑定模板列,但你可以绑定该列中包含的控件之一。这是我解决类似问题的方法:

<DataGridTemplateColumn Header="ColumnHeader">
     <DataGridTemplateColumn.CellTemplate>
           <DataTemplate>
                 <local:CustomisedUIElement Text="{Binding Path=PropertyToBindTo}"/>
           </DataTemplate>
     </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
如果我正确理解了初始例子,这意味着需要更改 GroupByField_Click() 方法的逻辑,以检查发送列是否为模板列,然后查看它包含的元素以获取 Binding 对象。

3

这是一个棘手的问题。我们通过遍历到它的祖父级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>

3
对于我来说,DataGridTemplateColumnClipboardContentBinding是一个解决方案:
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

您可以使用dgbc.ClipboardContentBinding;


0
  1. 不行,因为 DataGridTemplateColumn 没有继承自 DataGridBoundColumn,所以将其转换为 DataGridBoundColumn 会失败。
    要使上述代码工作,您所有的列都必须从 DataGridBoundColumn 抽象类继承。因此,制作自定义派生列类而不是使用 DataGridTemplateColumn 应该可以解决问题。

  2. 您可以在初始化时简单地填充一个

    Dictionary<DataGridColumn, string> BoundPropName;

    然后执行

    var propName = BoundPropName[dgch.Column]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接