我有一个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
列的值,以便可以确定哪个列包含被单击的按钮?
谢啦,谢啦
1条答案
按热度按时间zfciruhq1#
DataGridColumn
本身不是可视树的一部分。它是一个占位符模板,用于对单元格进行逻辑分组并描述它们的呈现方式。在解决了所有单元格和单元格编辑视图的绑定之后,列对象本身被DataGridCell
“替换”,以表示(呈现)单元格的实际值(内容)。这意味着所有单元格布局元素实际上都是单个DataGridCell
的子元素。这就是为什么你必须集中精力获得当前的
DataGridCell
。由于
DataGridCell
是ContentControl
,而单元格的视图是DataGridCell
的直接子视图,因此单元格内容(DataTemplate
)的模板化父视图是ContentPresenter
(位于DataGridCell
的ControlTemplate
中)。要将列的标题传递给
CommandParameter
,必须按如下方式调整Binding
的源和路径:字符串
作为一种替代方法,您可以始终内联
DataTemplate
并将列的标题硬编码为本地属性值。