以编程方式在Silverlight DataGrid详细信息中设置内容

时间:2010-02-18 21:26:39

标签: silverlight datagrid datatemplate

我需要根据外部设置文件中的信息动态设置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;
    }

1 个答案:

答案 0 :(得分:1)

我实际上尝试过您的代码并且正在运行。你应该检查两件事:

  • 您的_resultsGridLoaded变量是否初始化为false?
  • 您是否在DataGrid上设置了RowDetailsVisibilityMode =“VisibleWhenSelected”?

更新:由于某种原因不再有效。但我确实找到了两种方法可以解决它:

  1. 删除resultsGridLoaded逻辑。
  2. 如果您需要该逻辑,可以在DataGrid上为SelectionChanged事件添加处理程序,在那里您可以将_resultsGridLoaded变量设置为false,以便新的StackPanel正确添加其内容:
  3. 
    
        
            
                
                    
                    
                
            
        
    
    
    

    背后的代码:

    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;
    }
    

    希望这有帮助