1

依存関係のプロパティについて簡単に説明します。MVVMモデルとバインドして、遅延読み込みしているツリービューがあります。バインドされたプロパティIsExpandedに、このコードがあります

public bool IsExpanded
        {
            get { return _isExpanded; }
            set
            {
                if (value != _isExpanded)
                {
                    _isExpanded = value;
                    OnPropertyChanged("IsExpanded");
                }

                // Expand all the way up to the root
                if (_isExpanded && _parent != null)
                    if (!_parent.IsExpanded) _parent.IsExpanded = true;

                // Lazy load the child items, if necessary
                if (HasDummyChild)
                {
                    LoadChildren();
                }
            }
        }

これは、ノードの展開アイコンをクリックすると起動され、子が読み込まれ、完了すると、展開された子ノードが表示されます。

問題は、ロードに少し時間がかかる可能性があるため、ロード中に1人の子に「お待ちください、ロードしています...」などと言ってもらい、LoadChildren()メソッドが完了すると、実際の子を表示します。

デフォルトで子リストにダミーノードを追加します。このノードにはこの表示テキストがあり、LoadChildrenを呼び出してそのダミーリストを実際のリストに置き換えますが、問題は展開アイコンをクリックすると、セッターが最初に起動することです。子を表示するためにGETデータバインディングが呼び出される前に完全に完了します。

したがって、ダミーアイテムは表示されず、子リストに存在しますが、セッターが完了するまでに、ダミーアイテムは置き換えられ、表示されるのは、開く前に一時停止した完全なリストだけです。

アイコンをクリックすると、最初に既存のダミーの子を持つノードが視覚的に展開され、次に実際の子をフェッチしてロードしようとする方法はありますか?

4

1 に答える 1

1

バックグラウンドスレッドでロードを実行する必要があります。ただし、ロードされた子をリストに追加するには、UIスレッドで実行する必要があります。

このようなもの:

public void AddChildrenAsync()
{
    var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
    Task.Factory.Run(() => LongOperationThatReturnsTheChildren(); )
                .ContinueWith(t =>
                              {
                                  Children.AddRange(t.Result);
                                  Children.RemoveAt(0);
                              }, uiScheduler);
}

セッターで:

// Lazy load the child items, if necessary
if (HasDummyChild)
{
    LoadChildrenAsync();
}
于 2013-01-24T15:19:19.927 に答える