2013-12-23 2 views
1

В приведенном ниже XAML свойство команды корректно работает только с столбцом B. Нажатие на заголовок столбца A не вызывает метод выполнения команды. Разница в том, что в столбце B DataGridColumnHeader явно создается.DataGrid.ColumnHeaderStyle и командная привязка

С другой стороны, вторая часть стиля, триггер, устанавливающий базовую базу на нажатом состоянии, работает для обоих столбцов.

Почему свойство Command работает с колонкой B & не с колонкой A?

<DataGrid x:Name="Test" 
        ItemsSource="{Binding Items}" 
        AutoGenerateColumns="False" > 

      <DataGrid.ColumnHeaderStyle> 

       <Style TargetType="{x:Type DataGridColumnHeader}"> 

        <Setter Property="Command" 
          Value="{Binding MyCommand}"/> 
        <Setter Property="CommandParameter" 
          Value="{Binding Path=Content, RelativeSource={RelativeSource Self}}"/> 

        <Style.Triggers> 

         <Trigger Property="IsPressed" Value="True"> 
          <Setter Property="Background" Value="Red" /> 
         </Trigger> 

        </Style.Triggers> 

       </Style> 

      </DataGrid.ColumnHeaderStyle> 

      <DataGrid.Columns> 

       <DataGridTextColumn FontSize="12" 
            Header="Column A" 
            Width="200" 
            Binding="{Binding AData}" /> 

       <DataGridTextColumn FontSize="12" 
            Width="200" 
            Binding="{Binding BData}"> 

        <DataGridTextColumn.Header> 
         <DataGridColumnHeader Content="Column B" />            
        </DataGridTextColumn.Header 
         > 
       </DataGridTextColumn> 

      </DataGrid.Columns> 

     </DataGrid> 

EDIT

контекст данных:

namespace TestColumnHeaderCommandBinding 
{ 

    public class Item 
    { 
     public int AData { get; set; } 
     public string BData { get; set; } 

    } 


    public class MyCommand : ICommand 
    { 
     #region ICommand Members 

     public bool CanExecute(object parameter) 
     { 
      return true; 
     } 

     public event EventHandler CanExecuteChanged; 

     public void Execute(object parameter) 
     { 
      MessageBox.Show(parameter.ToString() + " clicked"); 
     } 

     #endregion 
    } 

    public class DataContext 
    { 

     public DataContext() 
     { 
      MyCommand = new TestColumnHeaderCommandBinding.MyCommand(); 


      Items = new List<Item>(5); 

      Items.Add(new Item { AData = 1, BData = "One" }); 
      Items.Add(new Item { AData = 2, BData = "Two" }); 
      Items.Add(new Item { AData = 3, BData = "Three" }); 
      Items.Add(new Item { AData = 4, BData = "Four" }); 
      Items.Add(new Item { AData = 5, BData = "Five" }); 
     } 



     public MyCommand MyCommand { get; set; } 


     public List<Item> Items { get; set; } 

    } 
} 
+0

вы публикуете свой viewmodel, пожалуйста, чтобы мы тестировали те же данные, что и вы. –

ответ

3

Если вы явно не указать содержимое заголовка, он будет содержать только простую строку, которая не унаследует DataContext из DataGrid.

Вы должны увидеть предупреждение в окне визуального вывода студии, содержащем что-то вроде этого:

'MyCommand' property not found on 'object' ''String' 

Чтобы исправить это, вы можете сделать привязку цели по DataContext из DataGrid:

<Setter Property="Command" 
     Value="{Binding DataContext.MyCommand, 
      RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" /> 
Мог
+0

Да, действительно. Могу ли я спросить, почему фоновое свойство отлично работает для экземпляра строки? У меня все еще есть проблемы, чтобы полностью понять это :) – Zilog

+1

Я думаю, что _style_ работает в обоих случаях. Он устанавливает для свойства Command обоих столбцов привязки «MyCommand». Проблема в том, что когда вы не укажете «DataGridColumnHeader», привязка будет искать свойство «MyBinding» в строке, которое оно не может найти. Таким образом, весь стиль отлично работает, но привязка в стиле-сеттере не работает. –

Смежные вопросы