FlexGrid for UWP
テンプレートのインクリメンタル更新
C1FlexGrid の使い方 > パフォーマンスの最適化 > テンプレートのインクリメンタル更新

CellContentChanging イベントによってテンプレートのインクリメンタル更新を行うと、セルテンプレートを段階的に更新できます。この方法では、一度にすべてレンダリングするのではなく、部品ごと、または段階的にレンダリングするため、ロード時間が短縮し、スクロールのパフォーマンスが向上します。

たとえば、グリッドを非常に高速でスクロールすると、セルの内容はプレーンテキストで表示されます。グリッドのスクロールが止まると、セルの内容が更新されて、複雑な計算を必要とする高負荷の内容が表示されます。このような内容は、スクロール中にはすべてのセルについてレンダリングする必要がありません。

以降の段階で、さらに高負荷のアクションを実行できます。これらのアクションは、UI スレッドが空いている場合に実行されます。これは、Microsoft GridView コントロールでの類似の機能に従ってモデル化されたものです。

メモ: 実際の CellContentChanging イベントは、Financial サンプルで確認できます。Control Explorer では、See it in action! サンプルです。コンピュータの Documents\ComponentOne Samples\UWP\C1.UWP.FlexGrid\CS には FlexGrid サンプルがインストールされています。

CellContentChanging イベントは次のようになります。

C#
コードのコピー
private void _flexFinancial_CellContentChanging(C1FlexGrid sender, CellContentChanging
          EventArgsargs)
    {
     if (args.Phase == 0)
     {
     args.RegisterUpdateCallback(_flexFinancial_CellContentChanging);
     }
     else if (args.Phase == 1)
     {
     var factory = _flexFinancial.CellFactory as FinancialCellFactory;
     if (factory != null)
     factory.ShowLiveData(_flexFinancial, args.Range, args.Cell);
     }
    }

上記の CellContentChanging サンプルは、次の ShowLiveData イベントを呼び出します。

C#
コードのコピー
public void ShowLiveData(C1FlexGrid grid, CellRange range, FrameworkElement cell)
    {
     var stockTicker = (cell as Border).Child as StockTicker;
     if (stockTicker != null)
     {
     var c = grid.Columns[range.Column];
     var r = grid.Rows[range.Row];
     var pi = c.PropertyInfo;
    
     // スパークラインを表示するには
     stockTicker.Tag = r.DataItem;
     stockTicker.BindingSource = pi.Name;
    
     var binding = new Binding { Path = new PropertyPath(pi.Name) };
     binding.Converter = new MyConverter();
     binding.Source = r.DataItem;
     binding.Mode = BindingMode.OneWay;
     stockTicker.SetBinding(StockTicker.ValueProperty, binding);
     }
    }

イベントで使用される StockTicker クラスは、スパークラインを表しています。これは、実装の中で高負荷の部分です。これを CellContentChanging イベントから呼び出すと、UI スレッドが空くまで ShowLiveData イベントは実行されなくなります。