21

我正在尝试获取与特定关联的属性的名称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. 还是我需要完全不同的东西,并更改上面的代码?

提前致谢!

4

5 回答 5

35

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

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

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

于 2010-12-03T18:11:20.657 回答
3

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

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
于 2012-10-10T10:32:49.787 回答
3

这是一个棘手的问题。我们通过遍历它的祖父 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>
于 2010-05-14T15:47:17.550 回答
1

您可以使用 dgbc.ClipboardContentBinding;

于 2010-11-24T14:11:11.940 回答
0
  1. 不,因为DataGridTemplateColumn不继承自DataGridBoundColumn,所以转换为DataGridBoundColumn会失败。
    要使上述代码正常工作,您的所有列都必须继承自DataGridBoundColumn抽象类。因此,制作自定义派生 Column 类而不是DataGridTemplateColumn应该工作。

  2. 你可以简单地填充一个

    Dictionary<DataGridColumn, string> BoundPropName;

    在初始化然后做

    var propName = BoundPropName[dgch.Column]

于 2010-04-09T13:19:24.877 回答