Как связать IList со многими элементами в Datagrid без замораживания - PullRequest
0 голосов
/ 03 июля 2011

Привет! Я анализирую txt-файл в List, а затем хочу связать эту коллекцию с элементом управления сеткой данных WPF.

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; }));
            });

        }

Как связать вызовы свойств из ViewModel в элемент управления DataGrid без зависания?

Ответы [ 2 ]

2 голосов
/ 07 ноября 2012

Возможный ответ - просто не загружать 18000 предметов.Никто не будет просматривать все эти элементы, прежде чем отфильтровать их до гораздо более удобного числа.

1 голос
/ 05 ноября 2011

Я думаю, что свойство VirtualizingStackPanel.IsVirtualizing решит эту проблему:

<DataGrid Name="Calls" VirtualizingStackPanel.IsVirtualizing="True" />
...