C# WPF-如何绑定DataGridTemplateColumn
我正在尝试获取与特定的C# WPF-如何绑定DataGridTemplateColumn,c#,wpf,binding,datagrid,datagridtemplatecolumn,C#,Wpf,Binding,Datagrid,Datagridtemplatecolumn,我正在尝试获取与特定的DataGridColumn关联的属性的名称,这样我就可以在此基础上做一些事情。当用户单击列标题上的上下文菜单项时,将调用此函数 这对于像DataGridTextColumn这样的开箱即用的滚动列类型很好,因为它们是绑定的,但问题是我的一些列是DataGridTemplateColumns,它们没有绑定 private void GroupByField_Click (object sender, RoutedEventArgs e){ MenuItem m
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”属性。。。但是我想这样做,这样上面的代码就可以工作了
我的问题分为两部分:
DataGridTemplateColumn
,以便上面的代码可以工作?我可以把它绑定到一个属性上吗DataGridTemplateColumn
没有继承自DataGridBoundColumn
,因此对DataGridBoundColumn
的转换将失败。要使上述代码正常工作,所有列必须继承自
DataGridBoundColumn
abstract类。因此,创建自定义派生列类而不是DataGridTemplateColumn
应该是可行的字典名代码>
初始化,然后执行
var-propName=BoundPropName[dgch.Column]
这是个棘手的问题。我们通过遍历到它的祖辈UserControl(我们在UserControl中有DataGrid)来实现绑定,并且UserControl被绑定到一个Presenter(在我们的例子中是模型)。 在下面的代码中,检查DataGridTemplate列中的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>
你可以用
dgbc.ClipboardContentBinding代码>尽管不能绑定模板列,但可以绑定该列中的一个控件。这就是我解决类似问题的方法:
<DataGridTemplateColumn Header="ColumnHeader">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<local:CustomisedUIElement Text="{Binding Path=PropertyToBindTo}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
如果我正确理解了最初的示例,这意味着更改GroupByField\u Click()
方法的逻辑,以检查发送列是否是模板列,然后查看其中包含的元素以获得绑定对象。对于我来说,DataGridTemplateColumn
的ClipboardContentBinding
是一种解决方案:
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