编辑:这是一个新的答案;我在底部留下了旧的答案。
如果设置Path =。在CommandParameter中,您将ContentPresenter作为Command中的对象。在这一点上,我仍然无法引用列的UID或名称。因此我创建了从DataGridTextColumn继承的DataGridTextColumnWithTag,并添加了一个名为Tag的DependencyProperty。现在在OnDrilldownHeaderClicked中,我可以确定在网格中点击的列。
这里是XAML中的DataTemplate:
<Window.Resources>
<c:CommandReference x:Key="DrilldownHeaderClickedReference" Command="{Binding DrilldownHeaderClicked}" />
<DataTemplate x:Key="ClickableHeaderTemplate">
<Button Content="{Binding}" Background="Transparent"
Command="{StaticResource DrilldownHeaderClickedReference}"
CommandParameter="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=.}" >
</Button>
</DataTemplate>
</Window.Resources>
这里是XAML中的DataGrid列的定义:
<Helpers:DataGridTextColumnWithTag
Header="Extra Name"
Tag="234"
Width="SizeToCells"
Binding="{Binding FinalName}"
FontSize="20"
HeaderTemplate="{StaticResource ResourceKey=ClickableHeaderTemplate}">
</Helpers:DataGridTextColumnWithTag>
这是新的DataGrid列:
public class DataGridTextColumnWithTag : DataGridTextColumn
{
public DataGridTextColumnWithTag() : base() { }
public string Tag
{
get { return (string)this.GetValue(TagProperty); }
set { this.SetValue(TagProperty, value); }
}
public static readonly DependencyProperty TagProperty = DependencyProperty.Register(
"Tag", typeof(string), typeof(DataGridTextColumnWithTag), new PropertyMetadata(string.Empty));
}
这里是Command Binding用于查找点击的列:
public ICommand DrilldownHeaderClicked { get; set; }
private void OnDrilldownHeaderClicked(object obj)
{
ContentPresenter cp = obj as ContentPresenter;
if (cp != null)
{
DataGridColumnHeader tp = cp.TemplatedParent as DataGridColumnHeader;
if (tp != null)
{
DataGridTextColumnWithTag column = tp.Column as DataGridTextColumnWithTag;
if (column != null)
{
string tag = column.Tag;
}
}
}
}
注意:这是旧的答案。这段代码获得列标题,但是如果/当列名更改时变得很脆弱。
以下DataTemplate让我得到列的标题。
然后我使用标题找出列。
希望这可以让你开始。
如果您可以扩展此解决方案,请发布您的答案。
<UserControl.Resources>
<c:CommandReference x:Key="DrilldownHeaderClickedReference" Command="{Binding DrilldownHeaderClicked}" />
<DataTemplate x:Key="ClickableHeaderTemplate">
<Button x:Name="btn" Content="{Binding}" Background="Transparent"
Command="{StaticResource DrilldownHeaderClickedReference}"
CommandParameter="{Binding}" >
</Button>
</DataTemplate>
</UserControl.Resources>
您正在使用哪个版本的.NET? CommandParameter在4.0之前的版本中不可绑定。 – 2010-10-04 15:14:07
我正在使用4.0。我正在尝试这个过去的4个小时,但无法想象它。看起来很简单,但。我需要的只是从数据模板绑定到父级的属性。这似乎是一个严重的错误,或者我错过了一些东西...... – 2010-10-04 16:11:10