嵌套DataGrid的性能很低,但有很多列

时间:2016-02-17 10:40:18

标签: wpf

我有一个WPF应用程序,它包含一个datagrid和嵌套的datagrid(RowDetailsTemplate)。 对于每一行都有一个内部有1000行的数据网格。 我看到嵌套的数据网格在打开时表现不佳。

我还尝试设置网格高度和VirtualizingStackPanel.IsVirtualizing =“True”,VirtualizingStackPanel.VirtualizationMode =“Recycling”。 但没有成功..

xaml:

<Window x:Class="TestMasterDetails.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">

<Grid>
    <DataGrid 
        ItemsSource="{Binding Persons}" 
        AutoGenerateColumns="False"
          VirtualizingStackPanel.IsVirtualizing="True"
                        VirtualizingStackPanel.VirtualizationMode="Recycling" >
        <DataGrid.Columns>
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button Content="+" Click="HandleExpandCollapseForRow"></Button>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn Header="Id" Binding="{Binding Id}"  Width="100"/>
            <DataGridTextColumn Header="FirstName" Binding="{Binding FirstName}"  Width="100"/>
            <DataGridTextColumn Header="LastName" Binding="{Binding LastName}"  Width="100"/>
        </DataGrid.Columns>
        <DataGrid.RowDetailsTemplate>
            <DataTemplate>
                <Grid Height="400">
                    <DataGrid 
                        ItemsSource="{Binding Addresses}"
                        AutoGenerateColumns="False"
                        VirtualizingStackPanel.IsVirtualizing="True"
                        VirtualizingStackPanel.VirtualizationMode="Recycling" >
                        <DataGrid.Columns>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                            <DataGridTextColumn Header="Id" Binding="{Binding Id}" Width="100"/>
                        </DataGrid.Columns>
                    </DataGrid>
                </Grid>
            </DataTemplate>
        </DataGrid.RowDetailsTemplate>
    </DataGrid>
</Grid>

MainWindow代码背后:

 public partial class MainWindow : Window
{
    VM.VM _vm = new VM.VM();
    public MainWindow()
    {
        InitializeComponent();
        DataContext = _vm;
    }

    private void HandleExpandCollapseForRow(object sender, RoutedEventArgs e)
    {
        Button expandCollapseButton = (Button)sender;
        DataGridRow selectedRow = DataGridRow.GetRowContainingElement(expandCollapseButton);

        if (null != expandCollapseButton && "+" == expandCollapseButton.Content.ToString())
        {
            selectedRow.DetailsVisibility = Visibility.Visible;
            expandCollapseButton.Content = "-";
        }
        else
        {
            selectedRow.DetailsVisibility = Visibility.Collapsed;
            expandCollapseButton.Content = "+";
        }
    }
}

ViewModel:

  public class VM : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    List<PersonModel> _persons = new List<PersonModel>();

    public List<PersonModel> Persons
    {
        get { return _persons; }
        set
        {
            if (_persons != value)
            {
                _persons = value;
                OnPropertyChanged("Persons");
            }
        }
    }
    const int ZERO = 0;
    const int LENGTH = 1000;
    public VM()
    {
        for (int i = ZERO; i < LENGTH; i++)
        {
            var person = new PersonModel() { FirstName = "FirstName" + i.ToString(), Id = i, LastName = "LastName" + i.ToString() };
            for (int j = ZERO; j < LENGTH; j++)
            {
                person.Addresses.Add(new AddressModel() { Id = j, Address = "Address" + j.ToString() });
            }
            _persons.Add(person);
        }
    }
}

0 个答案:

没有答案