2013-12-23 41 views
1

在下面的XAML中,command屬性只能正確地與列B一起工作。單擊列A的標題不會調用命令的execute方法。區別在於在列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> 

編輯

數據方面:

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

您應該看到包含這樣的事情在Visual Studio輸出窗口警告:

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

爲了解決這個問題,你可以綁定目標的DataGridDataContext

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

是的,確實如此。我可以問爲什麼背景屬性適用於字符串的實例嗎?我仍然有問題要完全理解它:) – Zilog

+1

我認爲_style_適用於這兩種情況。它將兩個列的Command屬性設置爲'MyCommand'綁定。問題是,當你沒有指定'DataGridColumnHeader'時,綁定將在字符串中尋找MyBinding屬性,它找不到。所以整個風格都可以正常工作,但風格制定者中的約束卻沒有。 –