0

在我的UWP应用程序中,我有一个ListView和一个定义的ItemTemplate。在这个模板里面有一个ProgressBar。现在,如果我启动多个BackgroundTransfers(下载),我会获得所有活动下载并将它们添加到ObservableCollection<MyClass>,并将此集合设置为ListSource中的ItemsSource。现在我的问题是,我如何更新这些ProgressBars?我已阅读了关于INotifyPropertyChanged的一些信息,但这是否是唯一的方法?UWP更新ListView中的多个ProgressBars

问候

回答

1

现在的问题是,我怎样才能更新这些ProgressBars?我已阅读了关于INotifyPropertyChanged的一些信息,但这是否是唯一的方法?

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

以下是主要步骤:

首先,实现INotifyPropertyChanged接口MyClass的:

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)); 
     } 
    } 
} 

二,进度的值绑定到进度财产XAML:

<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供您参考。

+0

这工作完美,非常感谢你杰里! – andy

+0

我的荣幸! andy :) –