【问题标题】:DataGrid.ColumnHeaderStyle and Command BindingDataGrid.ColumnHeaderStyle 和命令绑定
【发布时间】:2013-12-23 17:50:06
【问题描述】:

在下面的 XAML 中,命令属性仅适用于 B 列。单击 A 列的标题不会调用命令的执行方法。区别在于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; }

    }
}

【问题讨论】:

  • 您能否发布您的视图模型,以便我们使用与您相同的数据进行测试。

标签: c# wpf data-binding datagrid


【解决方案1】:

如果你没有明确指定头部的内容,它只会包含一个简单的字符串,它不会继承包含DataGrid的DataContext。

您应该会在 Visual Studio 输出窗口中看到一条警告,其中包含如下内容:

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

要解决这个问题,您可以将绑定目标设为DataGrid 的DataContext:

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

【讨论】:

  • 是的,确实如此。请问为什么 background 属性对于 string 的实例可以正常工作?我仍然无法完全理解它:)
  • 我认为 style 在这两种情况下都适用。它将两列的 Command 属性设置为 MyCommand 绑定。问题是,当您不指定 DataGridColumnHeader 时,绑定将在字符串上查找 MyBinding 属性,但它无法找到。所以整个样式都可以正常工作,但样式设置器中的绑定却不行。
猜你喜欢
  • 2023-04-09
  • 2011-04-13
  • 2010-12-23
  • 2019-05-07
  • 2021-02-11
  • 2016-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多