我需要根据外部设置文件中的信息动态设置DataGrid模板中的内容。该设置文件指定应在DataGrid中显示哪些数据字段。应用程序的管理员可以编辑设置以更改要显示的字段。我无法对要显示的字段进行硬编码。
我可以在运行时轻松地将列(DataGridTextColumn)添加到DataGrid。我根据设置在项目源中设置了一个字段绑定,显示正常。
现在我需要在用户点击一行时显示详细信息。我使用DataTemplate设置了RowDetailsTemplate,并在里面添加了一个Grid(或StackPanel)来格式化细节。如果我将带有绑定到字段的TextBlocks添加到标记中,它会显示详细信息。
但是如何以编程方式在详细信息模板中设置Grid / StackPanel的内容?如果我尝试在启动时按名称引用它们(例如,在页面Loaded事件中),则Grid / StackPanel控件为null。我已经尝试在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;
}
答案 0 :(得分:1)
我实际上尝试过您的代码并且正在运行。你应该检查两件事:
更新:由于某种原因不再有效。但我确实找到了两种方法可以解决它:
背后的代码:
private void resultsPanel_Loaded(object sender, RoutedEventArgs e)
{
if (_resultsGridLoaded)
return;
StackPanel pane = (StackPanel)sender;
TextBlock newChild = new TextBlock()
{
Text = "New text"
};
pane.Children.Add(newChild);
_resultsGridLoaded = true;
}
private void grid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
_resultsGridLoaded = false;
}
希望这有帮助