【问题标题】:Programmatically set content in Silverlight DataGrid details以编程方式在 Silverlight DataGrid 详细信息中设置内容
【发布时间】: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


    【解决方案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;
    }
    

    希望对你有帮助

    【讨论】:

    • 有趣的是它对你有用。我会尝试一个更简单的页面版本 - 一定是其他事情。我确实将 _resultsGridLoaded 初始化为 false,并且 RowDetailsVisibilityMode 设置为 VisibleWhenSelected,所以它必须是别的东西,但感谢提供线索!
    • 我想我找到了问题所在。检查我更新的帖子上的解决方案。出于某种原因,StackOverflow 现在正在显示我的 XMAL,但我基本上只是将 SelectionChange 事件添加到 DataGrid。如果有帮助,请告诉我,祝你好运!
    • 谢谢!现在可以了。关键确实是在 DataGrid 的 SelectionChanged 处理程序中将 _resultsGridLoaded 标志重置为 false。这会导致每次打开详细信息视图时都会加载数据。您每次都需要这样做似乎很奇怪,但它确实有效。顺便说一句,我没有足够的分数来将您的答案标记为有帮助,否则我会。
    • 很高兴我能帮上忙,不用担心将答案标记为有用。但我认为您可以将其标记为已接受的答案。问候
    猜你喜欢
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    相关资源
    最近更新 更多