DataGrid.ColumnHeaderStyle and Command Binding

3

在下面的XAML中,Command属性只能与B列正确地工作。 单击A列的标头不会调用命令的execute方法。 不同之处在于,在B列中,DataGridColumnHeader是显式实例化的。

另一方面,样式的第二部分,基于Pressed状态设置背景的触发器,对两列都有效。

为什么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; }

    }
}

你能否发布你的ViewModel,这样我们就可以在相同的数据上进行测试。 - dev hedgehog
1个回答

4

如果您没有明确指定标题的内容,它将只包含一个简单的字符串,该字符串不会继承包含的DataGridDataContext

您应该在Visual Studio输出窗口中看到一个警告,其中包含类似以下内容:

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

为了解决这个问题,你可以将绑定目标设置为 DataGridDataContext
<Setter Property="Command" 
        Value="{Binding DataContext.MyCommand,
          RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" />

是的,确实。我可以问一下为什么 background 属性对于字符串实例有效吗?我仍然有些难以完全理解 :) - Zilog
1
我认为这个_style_在两种情况下都适用。它将两列的Command属性设置为MyCommand绑定。问题是,当您不指定DataGridColumnHeader时,绑定将查找字符串上的MyBinding属性,但它找不到。因此,整个样式运行良好,但样式设置器中的绑定不起作用。 - Peter Hansen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接