我有一个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);
}
}
}