我使用WPFToolkit数据网格控件并以这种方式进行绑定:
<WpfToolkit:DataGrid x:Name="dgGeneral" SelectionMode="Single"
SelectionUnit="FullRow"
AutoGenerateColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False"
Grid.Row="1" ItemsSource="{Binding Path=Conversations}" >
public List<CONVERSATION> Conversations
{
get { return conversations; }
set
{
if (conversations != value)
{
conversations = value;
NotifyPropertyChanged("Conversations");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public void GenerateData()
{
BackgroundWorker bw = new BackgroundWorker();
bw.WorkerSupportsCancellation = bw.WorkerReportsProgress = true;
List<CONVERSATION> list = new List<CONVERSATION>();
bw.DoWork += delegate { list = RefreshGeneralData(); };
bw.RunWorkerCompleted += delegate
{
try
{
Conversations = list;
}
catch (Exception ex)
{
CustomException.ExceptionLogCustomMessage(ex);
}
};
bw.RunWorkerAsync();
}
并且在主窗口中,我在将窗口的DataCotext设置为包含GenerateData()的类的实例后调用GenerateData()。
RefreshGeneralData()返回我想要的一些数据列表,并快速返回。
总的来说,有近2000条记录和6列(我没有发布我在网格初始化时使用的代码,因为我不认为这可能是原因)并且网格挂起了将近10秒!
---
PS 我找到了以类似的方式编写的项目,但即使绑定了50000条记录也没有UI挂起!我做错了什么?
UPDATE 我认为这是因为ScrollViewer包含整个网格。但为什么?
答案 0 :(得分:2)
昨天我遇到了类似的情况(这就是我发现这篇文章的方式),经过多次努力,这是我学到的教训。我希望它也有助于其他人。
问题是数据网格的容器网格的width属性设置为Auto 。我的数据网格只有大约500行,每行有5列,但在这种自动模式下,它永远都是挂起的。一旦我将其更改为*或固定宽度。它马上起来。
答案 1 :(得分:1)
除非您明确禁用它,否则DataGrid中的项目将被虚拟化,即仅呈现当前显示的项目。由于UI自动化,您可能遇到了问题(这已在.NET 4中修复)。见http://wpf.codeplex.com/Thread/View.aspx?ThreadId=41964
如果您安装了Wacom平板电脑或屏幕阅读器,就会发生这种情况。