我使用按钮datatemplate网格标题。单击该按钮时,我想将uid(这是网格列(父)的属性)作为命令参数发送。
我试过: 1.模板绑定 2.相对来源 3. ElementName(不会绑定绑定) 但似乎没有任何效果。有任何线索,如何绑定到datatemplate中父项的属性?
<UserControl.Resources>
<DataTemplate x:Key="ClickableHeaderTemplate">
<Button x:Name="btn" Content="{Binding}" Background="Transparent"
Command="{Binding DrilldownHeaderClicked}"
CommandParameter="{Binding ElementName=????, Path=Uid}" >
</Button>
</DataTemplate>
</UserControl.Resources>
<DataGrid>
<DataGridTextColumn x:Name="TotalOid" x:Uid="PhMg5Ph-Oid"
Binding="{Binding TotalOid, Mode=OneWay,TargetNullValue=-}"
Header="Col1"
HeaderTemplate="{StaticResource ResourceKey=ClickableHeaderTemplate}">
</DataGridTextColumn>
</Datagrid>
答案 0 :(得分:2)
修改:这是一个新答案;我在底部留下了旧答案。
如果设置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));
}
这是命令绑定用于查找单击的列:
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>