如何将IList与许多项绑定到Datagrid而不冻结

时间:2011-07-03 09:11:34

标签: wpf datagrid binding freeze ilist

您好我将txt文件解析为List,然后我想将此集合绑定到WPF数据网格控件。

Txt文件包含18 000 - 19 000行。以下是此txt文件的示例。

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

解析没问题。

问题是我是否尝试将mehod Parse的输出绑定到datagrid控件。 WPF总是冻结。

我使用WPF,.NET 4和Caliburn Micro作为MVVM框架。

以下是问题代码:

XAML:

        <StackPanel Orientation="Vertical" Grid.Column="1">
            <DataGrid Name="Calls"/>
        </StackPanel>

视图模型:

        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 个答案:

答案 0 :(得分:2)

一个可能的答案是不加载18000件物品。在将其过滤到更易于管理的数字之前,没有人会查看所有这些项目。

答案 1 :(得分:1)

我认为VirtualizingStackPanel.IsVirtualizing属性可以解决此问题:

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