【问题标题】:WPF dependency property - instant reflection on GUI neededWPF 依赖属性 - 需要在 GUI 上的即时反射
【发布时间】:2013-01-08 09:37:07
【问题描述】:

简单介绍一下依赖属性。我有一个树视图,我正在延迟加载,与 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 数据绑定以显示子项之前完全完成。

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

有没有一种方法可以让您在单击该图标时,在视觉上扩展具有现有虚拟子节点的节点,然后尝试获取并加载实际的子节点?

【问题讨论】:

    标签: wpf data-binding treeview


    【解决方案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();
    }
    

    【讨论】:

    • 好的,非常感谢。所以没有办法将 GUI 线程上下文切换到 getter 或从集合中强制绑定 get-update?
    • @user1122909:不,只有一个 UI 线程。在您的代码中,它忙于设置 IsExpanded 属性。只有在属性设置器返回后,UI 线程才能对同时发生的任何事情做出反应。
    猜你喜欢
    • 2011-03-31
    • 2016-12-30
    • 1970-01-01
    • 2014-05-23
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多