2010-10-04 84 views
1

我用一个按钮数据网格标题。点击按钮时,我想发送uid(这是网格列(父)的属性)作为命令参数WPF - DataTemplate问题

我想: 1.模板绑定 2.相对源 3的ElementName(犯规Accpet头绑定) 但似乎没有任何工作。任何线索,如何绑定到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

您正在使用哪个版本的.NET? CommandParameter在4.0之前的版本中不可绑定。 – 2010-10-04 15:14:07

+0

我正在使用4.0。我正在尝试这个过去的4个小时,但无法想象它。看起来很简单,但。我需要的只是从数据模板绑定到父级的属性。这似乎是一个严重的错误,或者我错过了一些东西...... – 2010-10-04 16:11:10

回答

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)); 
} 

这里是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> 
+0

CommandParameter =“{Binding Uid}” – 2010-10-05 06:06:17

+0

已经尝试过这些。不工作。 – 2010-10-05 08:58:14

+0

问题是网格的标题受到本地化并且会改变。所以不能使用标题文本。 – 2010-10-05 10:04:43