我正在尝试获取与特定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
成为BOUND,以便上述代码可以使用?我能以某种方式将它绑定到一个属性吗?
或者我需要完全不同的东西,并更改上面的代码?
提前致谢!
AT
答案 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)
不,因为DataGridTemplateColumn
不会从DataGridBoundColumn
继承,所以转化为DataGridBoundColumn
会失败。
要使上面的代码工作,所有列都必须从DataGridBoundColumn
抽象类继承。因此,制作自定义派生列类而不是DataGridTemplateColumn
应该有效。
您可以简单地填充
Dictionary<DataGridColumn, string> BoundPropName;
初始化然后执行
var propName = BoundPropName[dgch.Column]