2011-07-03 6 views
0

こんにちは私はListにtxtファイルを解析し、このコレクションをWPF DataGridコントロールにバインドします。多くの項目を持つIListを凍結せずにDatagridにバインドするには

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

解析はOKです。

私は、DataGridコントロールにmehod Parseのバインド出力を試してみてください。 WPFは常にフリーズします。

MVVMフレームワークとしてWPF、.NET 4、Caliburn Microを使用します。ここで

は、問題のコードです:

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

     } 

どのように凍結することなく、DataGridコントロールにビューモデルからプロパティコールをバインドするには?

答えて

1

私はVirtualizingStackPanel.IsVirtualizingプロパティは、この問題を解決すると思う:

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

可能答えは単純に18000個のアイテムをロードしないことです。とにかくそれを管理しやすい数に絞り込む前に、誰もそれらのすべての項目を調べることはありません。

関連する問題