嵌套的Silverlight Datagrid - 行详细信息效果很好,但我想要一个按钮!

Den*_*ard 5 datagrid nested silverlight-3.0

我正在使用silverlight 3数据网格,在其中,我通过使用rowdetails(visibilitymode = visiblewhenselected)将相关记录嵌套在另一个控件中.

我真的很喜欢它的工作方式,但是当按下"+"按钮时,我更倾向于让网格显示行详细信息,就像单击节点时树会展开一样.

我尝试使用以下资源以编程方式定义模板:

<Grid.Resources>
    <DataTemplate x:Key="EmptyTemplate">
        <StackPanel>
            <!--<TextBlock Text="Empty Template!!!" />-->
        </StackPanel>
    </DataTemplate>
    <DataTemplate x:Key="SongTemplate">
        <StackPanel>
            <AdminControls:ArtistSongControl x:Name="ArtistSongControl" />
        </Stack>
    </DataTemplate>
</Grid.Resources>
Run Code Online (Sandbox Code Playgroud)

在网格的LoadingRowDetails事件中,我将选择要设置的模板:

e.Row.DetailsTemplate = (DataTemplate)LayoutRoot.Resources["SongTemplate"];
Run Code Online (Sandbox Code Playgroud)

这种方式有效,但我发现我在折叠前一行细节模板时遇到了问题,甚至崩溃了ie8(不确定是否相关).

基本上,我真的很喜欢silverlight 3 datagrid的工作原理,甚至是如何实现rowdetailstemplate的东西.我只是想延迟加载任何细节,直到有意地扩展一行(如树一样).所有的第三方网格似乎都是这样做的,而微软的网格太紧密了.有谁知道如何解决这个问题?

谢谢,丹尼斯

小智 6

丹尼斯,

如果你还没有已经找到一个答案,我想相同的行为,并通过自定义RowHeaderTemplate,它可以让你在每行的头扔一个按钮解决了这个问题.然后我为按钮实现了一个处理程序,如下所示:

private void ToggleButton_Click(object sender, System.Windows.RoutedEventArgs e)
{
    ToggleButton button = sender as ToggleButton;
    DataGridRow row = button.GetVisualAncestorOfType<DataGridRow>();

    if (button.IsChecked == true)
    {
        row.DetailsVisibility = Visibility.Visible;

        //Hide any already expanded row. We only want one expanded at a time for simplicity and
        //because it masks a virtualization bug in the datagrid.
        if (_expandedRow != null)
            _expandedRow.DetailsVisibility = Visibility.Collapsed;

        _expandedRow = row;
    }
    else
    {
        row.DetailsVisibility = Visibility.Collapsed;
        _expandedRow = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,GetVisualAncestorOfType <>是我实现的扩展方法,用于挖掘可视化树.

您还需要将datagrid的HeadersVisibility属性设置为Row或All