我需要根据外部设置文件中的信息动态设置DataGrid模板中的内容。该设置文件指定哪些数据字段应显示在DataGrid中。应用程序的管理员可以编辑设置以更改要显示的字段。我无法对要显示的字段进行硬编码。以编程方式在Silverlight DataGrid中设置内容
我可以在运行时轻松地将列(DataGridTextColumn的)添加到DataGrid。我根据设置设置了项目源中字段的绑定,并且显示正常。
现在我需要显示用户单击行时的详细信息。我用DataTemplate设置了一个RowDetailsTemplate,并在其中添加了一个Grid(或一个StackPanel)来格式化细节。如果我将TextBlocks与字段绑定添加到标记中,它会显示详细信息。
但是,我怎样才能以编程方式设置细节模板中的网格/ 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;
}
这是有趣的是,它为你工作。我会尝试更简单的版本 - 必须是其他事情。我将_resultsGridLoaded初始化为false,并将RowDetailsVisibilityMode设置为VisibleWhenSelected,所以它必须是其他内容,但是要感谢这些线索! – 2010-02-18 23:39:51
我想我发现了这个问题。检查我更新的帖子上的解决方案。出于某种原因,StackOverflow现在显示我的XMAL,但我基本上只是将SelectionChange事件添加到DataGrid。让我知道它是否有用,祝你好运! – 2010-02-19 16:38:39
谢谢!它现在有效。关键在于在DataGrid的SelectionChanged处理程序中将_resultsGridLoaded标志重置为false。这会导致每次打开详细信息视图时都会加载数据。似乎很奇怪,你每次都需要这样做,但它很有效。顺便说一句,我没有足够的积分来标记你的答案有帮助,否则我会。 – 2010-03-09 16:56:02