2010-10-04 2 views
1

Я datatemplate заголовок сетки с помощью кнопки. Когда кнопка нажата, Я хочу отправить uid (который является свойством столбца сетки (parent)) в качестве параметра команды.WPF - DataTemplate вопрос

Я пробовал: 1. Шаблон Binding 2. Относительная Source 3. ElementName (оленья кожа accpet Binding) Но ничего, кажется, работает. Любая подсказка, как привязываться к свойству родителя в 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. –

+0

Я использую 4.0. Я пробую это в течение последних 4 часов, но не мог этого понять. Кажется, довольно просто. Все, что мне нужно, - связать с родительским свойством с datatemplate. Это, кажется, серьезная ошибка или я что-то не хватает ... –

ответ

2

Редактировать: это новый ответ; Я оставил старый ответ внизу.

Если вы установили Path =. в CommandParameter вы получаете ContentPresenter как объект в Command. На этом этапе я все еще не мог ссылаться на Uid или Name of Column. Таким образом, я создал DataGridTextColumnWithTag, который наследуется от DataGridTextColumn, и я добавил DependencyProperty под названием Tag. Теперь в OnDrilldownHeaderClicked я могу определить столбец, нажатый в Grid.

Здесь DataTemplate в XAML:

<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> 

Вот определение DataGrid столбца в XAML:

<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> 
+0

CommandParameter = "{Binding Uid}" –

+0

уже пробовал это. не работает. –

+0

Проблема заключается в том, что заголовок сетки подвергается локализации и будет меняться. поэтому не можете использовать текст заголовка. –