WPF - 如何绑定DataGridTemplateColumn

时间:2010-04-09 11:25:35

标签: c# wpf binding datagrid 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(因为它有一个图像和其他一些东西)。因此,它实际上并没有绑定到'Name'属性...但我希望如此,以便上面的代码可以工作。

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

  1. 是否可以使DataGridTemplateColumn成为BOUND,以便上述代码可以使用?我能以某种方式将它绑定到一个属性吗?

  2. 或者我需要完全不同的东西,并更改上面的代码?

  3. 提前致谢!

    AT

5 个答案:

答案 0 :(得分:31)

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

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

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

答案 1 :(得分:3)

对我来说,ClipboardContentBinding的{​​{1}}是一个解决方案:

DataGridTemplateColumn

答案 2 :(得分:2)

这是一个棘手的问题。我们通过遍历其祖父母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 :(得分:1)

你可以使用 dgbc.ClipboardContentBinding;

答案 4 :(得分:0)

  1. 不,因为DataGridTemplateColumn不会从DataGridBoundColumn继承,所以转化为DataGridBoundColumn会失败。
    要使上面的代码工作,所有列都必须从DataGridBoundColumn抽象类继承。因此,制作自定义派生列类而不是DataGridTemplateColumn应该有效。

  2. 您可以简单地填充

    Dictionary<DataGridColumn, string> BoundPropName;

    初始化然后执行

    var propName = BoundPropName[dgch.Column]