【发布时间】:2011-01-18 12:54:05
【问题描述】:
我需要根据外部设置文件中的信息动态设置 DataGrid 模板中的内容。该设置文件指定应在 DataGrid 中显示哪些数据字段。应用程序的管理员可以编辑设置以更改要显示的字段。我无法对要显示的字段进行硬编码。
我可以在运行时轻松地将列(DataGridTextColumn's)添加到 DataGrid。我根据设置将绑定设置到项目源中的字段,并且显示正常。
现在我需要在用户单击一行时显示详细信息。我用 DataTemplate 设置了一个 RowDetailsTemplate,并在里面添加了一个 Grid(或 StackPanel)来格式化细节。如果我将带有字段绑定的 TextBlocks 添加到标记中,它会很好地显示详细信息。
但是如何以编程方式在详细信息模板中设置 Grid/StackPanel 的内容?如果我尝试在启动时按名称引用它们(例如,在页面 Loaded 事件中),则 Grid/StackPanel 控件为空。我尝试使用 Grid/StackPanel 上的 Loaded 事件来添加详细信息。该代码运行并似乎将内容添加到 Grid/StackPanel,但当我单击该行时实际上没有出现任何内容。我猜问题是模板/网格已经加载并忽略了我所做的更改。
这是我在 Loaded 事件的处理程序中使用的代码示例。即使我做了这么简单的事情,单击该行时也不会出现详细信息窗格。
<data:DataGrid.RowDetailsTemplate>
<DataTemplate>
<Border Background="LightBlue" >
<StackPanel x:Name="resultsDetailsPanel"
Orientation="Vertical"
Loaded="resultsDetailsPanel_Loaded">
</StackPanel>
</Border>
</DataTemplate>
</data:DataGrid.RowDetailsTemplate>
private void resultsDetailsPanel_Loaded(object sender, RoutedEventArgs e)
{
if (_resultsGridLoaded)
return;
StackPanel detailsPanel = sender as StackPanel;
TextBlock fieldNameTextBlock = new TextBlock();
fieldNameTextBlock.Text = "TESTING";
detailsPanel.Children.Add(fieldNameTextBlock);
_resultsGridLoaded = true;
}
【问题讨论】:
标签: silverlight datagrid datatemplate