2010-02-18 67 views
1

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

回答

1

我其实已经试过你的代码并且正在工作。两件事你应该检查:

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

更新:由于某种原因,不再工作。但我确实发现了两种方法可以修复它:

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


    
     
      
       
       
      
     
    

 

而后面的代码:

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

希望这有助于

+0

这是有趣的是,它为你工作。我会尝试更简单的版本 - 必须是其他事情。我将_resultsGridLoaded初始化为false,并将RowDetailsVisibilityMode设置为VisibleWhenSelected,所以它必须是其他内容,但是要感谢这些线索! – 2010-02-18 23:39:51

+0

我想我发现了这个问题。检查我更新的帖子上的解决方案。出于某种原因,StackOverflow现在显示我的XMAL,但我基本上只是将SelectionChange事件添加到DataGrid。让我知道它是否有用,祝你好运! – 2010-02-19 16:38:39

+0

谢谢!它现在有效。关键在于在DataGrid的SelectionChanged处理程序中将_resultsGridLoaded标志重置为false。这会导致每次打开详细信息视图时都会加载数据。似乎很奇怪,你每次都需要这样做,但它很有效。顺便说一句,我没有足够的积分来标记你的答案有帮助,否则我会。 – 2010-03-09 16:56:02