Как связать IList со многими элементами в Datagrid без замораживания
Привет! Я анализирую txt файл в List, а затем хочу связать эту коллекцию с WPF datagrid control.
Txt файл содержит 18 000 - 19 000 строк. Вот образец этого текстового файла.
910839320 Hovory vo VPS 24.05.2011 08:52 0910839253 VPS STÁLA 00:01:03 0,0488
910839320 Hovory vo VPS 26.05.2011 10:01 0910839267 VPS STÁLA 00:01:00 0,0465
910839320 Hovory vo VPS 26.05.2011 10:04 0910839263 VPS STÁLA 00:00:19 0,0147
Я анализирую текстовый файл в IList с помощью этой функции.
public class Call
{
public string Number { get; set; }
public string CallType { get; set; }
public string Dt { get; set; }
public string CallingNumber { get; set; }
public string VoiceNetwork { get; set; }
public string Type { get; set; }
public string TalkTime { get; set; }
public string Price { get; set; }
}
private static IEnumerable<Call> Parse(string path)
{
var calls = new List<Call>();
string[] lines = System.IO.File.ReadAllLines(path);
for (int i = 0; i < lines.Length; i++)
{
string[] line = lines[i].Split('\t');
var call = new Call
{
Number = line[0],
CallType = line[1],
Dt = line[2],
CallingNumber = line[3],
VoiceNetwork = line[4],
Type = line[6],
TalkTime = line[7],
Price = line[10]
};
calls.Add(call);
}
return calls;
}
Разбор в порядке.
Проблема в том, что если я пытаюсь привязать вывод метода Parse к управлению сеткой данных. WPF всегда замерзает.
Я использую WPF, .NET 4 и Caliburn Micro в качестве фреймворка MVVM.
Вот код проблемы:
XAML:
<StackPanel Orientation="Vertical" Grid.Column="1">
<DataGrid Name="Calls"/>
</StackPanel>
ViewModel:
public IList<Call> Calls
{
get { return _class; }
set
{
_class = value;
NotifyOfPropertyChange(()=>Calls);
}
}
public void OpenTsv()
{
Task.Factory.StartNew(() =>
{
var dlg = new Microsoft.Win32.OpenFileDialog
{ DefaultExt = ".tsv", Filter = "Tsv documents (.tsv)|*.tsv" };
bool? result = dlg.ShowDialog();
IList<Call> calls = new List<Call>();
if (result == true)
{
Path = dlg.FileName;
calls = TsvParser.Parse(Path);
}
Execute.OnUIThread((System.Action)(() =>
{ Calls = calls; }));
});
}
Как связать свойство Calls из ViewModel с элементом управления DataGrid без зависания?
2 ответа
Возможный ответ - просто не загружать 18000 предметов. Никто не будет просматривать все эти элементы, прежде чем отфильтровать их до гораздо более управляемого числа в любом случае.
Я думаю VirtualizingStackPanel.IsVirtualizing
свойство решит эту проблему:
<DataGrid Name="Calls" VirtualizingStackPanel.IsVirtualizing="True" />