0

我有一个带有 Telerik 数据绑定列表框的 C# Windows Phone 7 应用程序。数据绑定列表框的 ItemsSource 属性绑定到我的视图模型中的一个属性,该属性从 RESTful Web 服务中检索其内容。只读属性的逻辑如下:

List 属性是否为空(首次使用)?

^ 返回一个空列表

^ 异步检索列表内容

^ 检索完成时引发属性更改事件

它工作正常,现在我想在异步操作正在进行时显示进度叠加。我正在使用 Coding4Fun 工具包的进度覆盖控件。问题是我不知道在哪里“插入”正确的代码来显示和隐藏进度覆盖。我尝试从下面的视图模型中执行此操作(请参见下面的代码),但进度覆盖不可见。我猜那是因为它没有正确地作为当前可见的应用程序页面的父级?

如何正确显示进度叠加?请注意,如果有一个很好的 XAML 方法可以做到这一点,我想知道,否则我会尽我所能。

    /// <summary>
    /// Does the async load of the list we return to the data bound contro.
    /// </summary>
    /// 
    async private void LoadListContentsAsync()
    {
        bool bIsProgOverlayShowing = false;

        if (!IsLoadingList)
        {
            // Set the busy flag.
            IsLoadingList = true;

            Coding4Fun.Toolkit.Controls.ProgressOverlay po = new Coding4Fun.Toolkit.Controls.ProgressOverlay();

            po.Content = "Loading List";
            po.Show();

            // Set the cleanup flag for the progress overlay.
            bIsProgOverlayShowing = true;

            try
            {
                // Do the asynchronous load.
                List<string> bl = await this.GetListContentsAsync();

                _listContents = bl.ToObservableCollection();

                // Raise the property changed event handler.
                RaisePropertyChanged("ListContents");
            }
            finally
            {
                // Make sure the loading flag is cleared.
                IsLoadingList = false;

                // Hide the progress overlay if it is showing.
                if (bIsProgOverlayShowing)
                    po.Hide();
            }
        } // if (!IsLoadingList)
    } // async private void LoadListContentsAsync()
4

1 回答 1

0

你可能会发现我的TaskCompletionNotifier类型很有用。您可以从这里获取源代码;它将在我的 AsyncEx 库的下一个版本中,但不在当前版本中。

您的 VM 属性可以是类型ITaskCompletionNotifier<ObservableCollection<string>>,并且可以通过传递一个Task<ObservableCollection<string>>to来创建TaskCompletionNotifierFactory.Create。实际的 VM 属性可以是只读的。

完成后,您的数据绑定代码就可以myVMProperty.Result用来绑定到ObservableCollection<string>(该Result属性是null直到任务完成)。其他数据绑定代码可用于myVMProperty.IsCompleted绑定到一个布尔值,指示操作是否完成。进度指示器可以使用常见的布尔到可见性转换器绑定到此。

于 2013-04-18T15:09:40.477 回答