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<DataGridColumn, string> BoundPropName;
初始化然后做
var propName = BoundPropName[dgch.Column]
【讨论】:
【参考方案3】:对我来说,ClipboardContentBinding
或 DataGridTemplateColumn
是一个解决方案:
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的主要内容,如果未能解决你的问题,请参考以下文章