WPF依赖属性 - 需要对GUI进行即时反射

时间:2013-01-24 15:12:56

标签: wpf data-binding treeview

关于依赖属性的快速方法。我有一个树视图,我懒得加载,绑定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();
                }
            }
        }

单击节点上的展开图标时会触发,然后加载子节点,完成后会显示展开的子节点。

问题是这可能需要一点时间来加载,所以当它加载时我想让一个孩子说“请等待,加载......”然后当LoadChildren()方法完成时,然后显示实际的孩子。

我默认在子列表中添加一个虚拟节点,它有这个显示文本,然后调用LoadChildren并用实际的列表替换该虚拟列表,但问题是当你点击展开图标时,setter会先触发,需要在调用GET数据绑定之前完全完成才能显示子节点。

因此虚拟项目永远不会显示,它存在于子项列表中,但是当设置器完成时,它已被替换,并且唯一可以显示的是在打开它之前暂停的完整列表。

有没有一种方法可以让你想到这一点,当你点击图标时,它会在视觉上用现有的虚拟子节点FIRST扩展节点,然后那些尝试获取并加载实际的子节点?

1 个答案:

答案 0 :(得分: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();
}