我在类中创建了一个索引属性,我需要为x = [''.join(operator.itemgetter(*indices)(stuff)) for indices in y]
x.sort()
中的DataGridTemplateColumn
的每个单元格设置绑定(每个单元格与其索引属性的相应项目)。 / p>
用于工作计划生成应用程序。网格中的每个单元格将显示与员工相关的数据并进行转移 - 班次中的更多员工将向右增加网格,即添加更多列。网格显示以编程方式创建和填充的数据结构,而不是绑定到数据库表。为了便于在本论坛中进行演示和代码检查,我已将所有内容简化为必需品。
这是一张照片:
这显然是错误的,因为我无法正确设置绑定。我可以将StackPanel中的字段绑定到索引属性的第一个(或任何其他)项,但不能绑定到索引/参数化设置中。
这是我的xaml(部分):
DataGrid
生成列的代码:
<Grid HorizontalAlignment="Left">
<DataGrid x:Name="grdSch" HorizontalAlignment="Left" Height="400" VerticalAlignment="Top" Margin="8,0,0,0" AutoGenerateColumns="False" SelectionUnit="Cell"/>
</Grid>
<Page.Resources>
<DataTemplate x:Key="SPI_Template">
<StackPanel>
<TextBlock Text="{Binding Path=shftDate}"/>
<TextBlock Text="{Binding Path=shftKind}"/>
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="SEI_Template">
<StackPanel>
<TextBlock Text="{Binding Path=data[0].emplName}"/>
<TextBlock Text="{Binding Path=data[0].shftTime}"/>
</StackPanel>
</DataTemplate>
</Page.Resources>
private void Page_Loaded(object sender, RoutedEventArgs e)
{
// Create the grid columns
DataGridTemplateColumn col = new DataGridTemplateColumn();
col.Header = "Shift";
col.CellTemplate = (DataTemplate)FindResource("SPI_Template");
grdSch.Columns.Add(col);
for (int i = 0; i < 30; i++)
{
col = new DataGridTemplateColumn();
col.Header = "Employee " + (i + 1);
col.Width = 100;
col.CellTemplate = (DataTemplate)FindResource("SEI_Template");
// for now show only the 5 first elements
col.Visibility = i >= 5 ? Visibility.Hidden : Visibility.Visible;
grdSch.Columns.Add(col);
}
}
属性已编入索引。现在的绑定(例如data[]
)适用于属性的第1项。如果我将其更改为"{Binding Path=data[0].emplName}"
,它将绑定到第二个,依此类推。但这当然不是我需要的。有没有办法将绑定更改为.... "{Binding Path=data[1].emplName}"
?搜索并找到一些关于&#34;参数化绑定的帖子&#34;等,但无法找到一些非常明显或直截了当的东西。当然,我可以采用愚蠢的方式在xaml中添加30个类似的模板(仅在索引属性的索引中有所不同) - 这肯定会有效,但我正在考虑以更好的方式制作它。 / p>
有人可以帮忙吗?
提前谢谢
答案 0 :(得分:1)
一种解决方案是创建自定义列类型(从DataGridTemplateColumn
派生),它公开了一个额外的Binding
属性,我们将使用它来绑定单元格内容。这是列代码:
public class DataGridBoundColumn : DataGridTemplateColumn
{
public BindingBase Binding { get; set; }
protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
{
var element = base.GenerateEditingElement(cell, dataItem);
if (element != null && Binding != null)
element.SetBinding(ContentPresenter.ContentProperty, Binding);
return element;
}
protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
{
var element = base.GenerateElement(cell, dataItem);
if (element != null && Binding != null)
element.SetBinding(ContentPresenter.ContentProperty, Binding);
return element;
}
}
然后我们需要稍微修改列生成代码:
private void Page_Loaded(object sender, RoutedEventArgs e)
{
var col = new DataGridTemplateColumn
{
Header = "Shift",
CellTemplate = (DataTemplate)FindResource("SPI_Template")
};
grdSch.Columns.Add(col);
for (int i = 0; i < 30; i++)
{
col = new DataGridBoundColumn
{
Header = "Employee " + (i + 1),
Binding = new Binding($"data[{i}]"),
Width = 100,
CellTemplate = (DataTemplate)FindResource("SEI_Template"),
};
grdSch.Columns.Add(col);
}
}
最后,由于我们生成的列已经显示data[i]
,因此我们需要相应地修改SEI_Template
:
<DataTemplate x:Key="SEI_Template">
<StackPanel>
<TextBlock Text="{Binding emplName}" />
<TextBlock Text="{Binding shftDate}" />
</StackPanel>
</DataTemplate>