WPF - DataTemplate вопрос - PullRequest
       6

WPF - DataTemplate вопрос

1 голос
/ 04 октября 2010

Я датирую заголовок сетки кнопкой. Когда кнопка нажата, Я хочу отправить 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>

1 Ответ

2 голосов
/ 04 октября 2010

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

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

Вот шаблон данных в 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));
}

Вот команда 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>
...