XAML WPF如何从DataGridCell内的DataTemplate绑定到列标题

uyto3xhc  于 2023-08-01  发布在  其他
关注(0)|答案(1)|浏览(131)

我有一个DataGrid,它的单元格都被按钮填满了。所有的按钮都链接到同一个命令,但是我想知道按下的按钮位于哪个列,所以我想我应该将按钮CommandParameter绑定到该列的Header
以下是我的观点:

<DataGrid ItemsSource="{Binding ModelList}"
              AutoGenerateColumns="False">
                <DataGrid.Resources>
                    <DataTemplate x:Key="ButtonTemplate">
                        <Button Content="{Binding Name}"
                                CommandParameter="{Binding Header, RelativeSource={RelativeSource AncestorType=control:DataGridBoundTemplateColumn}}"
                                Command="{Binding DataContext.NewCommand, RelativeSource={RelativeSource AncestorType=DataGrid}}">
                        </Button>
                    </DataTemplate>
                </DataGrid.Resources>

                <DataGrid.Columns>
                    <control:DataGridBoundTemplateColumn x:Name="Test" Header="Powerbar" 
                                                         Binding="{Binding PowerBarModel}"
                                                         CellTemplate="{StaticResource ButtonTemplate}"
                                                         CellEditingTemplate="{StaticResource ButtonTemplate}">
                    </control:DataGridBoundTemplateColumn>
                    <control:DataGridBoundTemplateColumn Header="Circuit Breaker"
                                                         Binding="{Binding BreakerModel}"
                                                         CellTemplate="{StaticResource ButtonTemplate}"
                                                         CellEditingTemplate="{StaticResource ButtonTemplate}">
                    </control:DataGridBoundTemplateColumn>
                    <control:DataGridBoundTemplateColumn Header="Circuit Equipment"
                                                         Binding="{Binding EquipmentModel}"
                                                         CellTemplate="{StaticResource ButtonTemplate}"
                                                         CellEditingTemplate="{StaticResource ButtonTemplate}">
                    </control:DataGridBoundTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>

字符串
下面是我的ViewModel:

public class ViewModel : IDialogAware
    {
        public DelegateCommand<object> NewCommand { get; set; }

        public ViewModel()
        {         
            NewCommand = new DelegateCommand<object>(NewCommandExecute);
        }      

        private void NewCommandExecute(object commandParameter)
        {
            var detailItemList = new List<object>();

            if (commandParameter == null)
            {
                return;
            }

            switch (commandParameter)
            {
                case "Powerbar":
                {
                    detailItemList = PowerbarList;
                    break;
                }
                case "Circuit Breaker":
                {
                    detailItemList = BreakerList;
                    break;
                }
                case "Circuit Equipment":
                {
                    detailItemList = EquipmentList;
                    break;
                }
    }


然而,CommandParameter始终为空。如果我用静态字符串(例如CommandParameter="Test")替换绑定,则CommandParameter会向NewCommandExecute传递一个值,但不是在我尝试绑定时传递。
如何将CommandParameter绑定到Header列的值,以便可以确定哪个列包含被单击的按钮?
谢啦,谢啦

zfciruhq

zfciruhq1#

DataGridColumn本身不是可视树的一部分。它是一个占位符模板,用于对单元格进行逻辑分组并描述它们的呈现方式。在解决了所有单元格和单元格编辑视图的绑定之后,列对象本身被DataGridCell“替换”,以表示(呈现)单元格的实际值(内容)。这意味着所有单元格布局元素实际上都是单个DataGridCell的子元素。
这就是为什么你必须集中精力获得当前的DataGridCell
由于DataGridCellContentControl,而单元格的视图是DataGridCell的直接子视图,因此单元格内容(DataTemplate)的模板化父视图是ContentPresenter(位于DataGridCellControlTemplate中)。
要将列的标题传递给CommandParameter,必须按如下方式调整Binding的源和路径:

<DataTemplate x:Key="ButtonTemplate">
  <Button CommandParameter="{Binding RelativeSource={RelativeSource TemplatedParent}, 
                                     Path=(ContentPresenter.Parent).(DataGridCell.Column).Header}" />
</DataTemplate>

字符串
作为一种替代方法,您可以始终内联DataTemplate并将列的标题硬编码为本地属性值。

相关问题