UWP在ListView中更新多个ProgressBars

时间:2016-05-31 05:53:12

标签: c# .net data-binding win-universal-app windows-10-universal

在我的UWP应用程序中,我有一个带有定义的ItemTemplate的ListView。在此模板中,有一个ProgressBar。现在,如果我启动多个BackgroundTransfers(下载),我将获得所有活动的下载并将它们添加到rule "Test" when $i1: Input() $i2: Input(hex > $i1.hex) then //Do whatever you need here end 并在ListView中将此集合设置为ItemsSource。现在我的问题是,我如何更新这些ProgressBars?我已经阅读了有关INotifyPropertyChanged的内容,但这是正确的方法吗?

祝你好运

1 个答案:

答案 0 :(得分:1)

  

现在我的问题是,如何更新这些ProgressBars?我已经阅读了有关INotifyPropertyChanged的内容,但这是正确的方法吗?

INotifyPropertyChanged接口用于通知客户端(通常是绑定客户端)属性值已更改。我正在使用它来更新BackgroundTransfers的ProgressBars。

以下是主要步骤:

首先,为MyClass实现INotifyPropertyChanged接口:

public class MyClass : INotifyPropertyChanged
{
    public DownloadOperation DownloadOperation { get; set; }

    private int _progress;
    public int Progress
    {
        get
        {
            return _progress;
        }
        set
        {
            _progress = value;
            RaisePropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void RaisePropertyChanged([CallerMemberName] string name = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    }
}

其次,将ProgressBar的值绑定到XAML中的Progress属性:

<ProgressBar Value="{Binding Progress}" Margin="0,5"></ProgressBar>

然后,使用Progress调用回调来更新后面代码中的进度:

Progress<DownloadOperation> progressCallback = new Progress<DownloadOperation>(DownloadProgress);
await download.AttachAsync().AsTask(cancelToken.Token, progressCallback);


private void DownloadProgress(DownloadOperation download)
    {
        try
        {
            MyClass myClass = myClasses.First(p => p.DownloadOperation == download);
            myClass.Progress = (int)((download.Progress.BytesReceived * 100) / download.Progress.TotalBytesToReceive);
        }
        catch (Exception e)
        {
            Debug.WriteLine(e.ToString());
        }
    }

以下是整个BackgroundTransferDemo供您参考。