绑定多个下载进度
本文关键字:下载 绑定 | 更新日期: 2023-09-27 18:13:41
我在ObservableCollection中有一个DownloadOperation列表,变量具有属性Progress。TotalBytesToReceive,Progress.BytesReceived。当我试图将这个属性绑定到max &进度条的值,它给我绑定表达式错误属性没有找到。我绑定了其他属性ResultFile。名字和它的成功。有什么办法可以解决这个问题吗?
更新:我发现我需要使用来自进度的转换器来获得totalbytes值,但现在的问题是值没有更新,并且似乎observablecollection不监视接收到的字节值。
<ListView DataContext="{Binding Download}"
ItemsSource="{Binding}">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Margin="5">
<TextBlock Text="{Binding ResultFile.Name}"
FontSize="20"
Foreground="Black"/>
<ProgressBar Maximum="100"
Value="{Binding Progress, Converter={StaticResource ByteReceivedConverter}}"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
我有这个作为viewmodel, activeDownloads包含可观察下载列表
public ObservableCollection<DownloadOperation> activeDownloads = new ObservableCollection<DownloadOperation>();
我试图提取字节接收&
后面代码中的totalbytestreceive double received = 0;
double total = 0;
foreach (var item in activeDownloads)
{
received += item.Progress.BytesReceived;
total += item.Progress.TotalBytesToReceive;
}
if (total != 0) {
var percentage = received / total * 100;
它的工作没有任何问题,observablecollection也工作得很好,当我添加下载它自动改变视图,而我不必手动更新数据上下文,相同的结果,如果下载完成/删除。但如果我直接绑定进程。BytesReceived到progressbar值,它给了我路径错误,但我能够将它绑定到Progress属性。所以我做了一个转换器来检索值。
下面是我用来转换Progress属性的转换器:
public class ByteReceivedConverter:IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
BackgroundDownloadProgress bytes = (BackgroundDownloadProgress)value;
if (bytes.TotalBytesToReceive != 0)
return bytes.BytesReceived/bytes.TotalBytesToReceive*100;
else return 0;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
是否有可能使这个DownloadOperation具有接收字节级别的可观察性?,因为我没有做这个属性,我只是从meta检索它。还是我做错了?因为现在我遇到的问题是视图没有意识到字节接收值发生了变化。
如果它是不可能的,我应该使另一个视图模型与INotifyPropertyChanged实现?
首先,您不需要使用转换器;绑定Max和Value属性本来是可以的,但是您可能没有将源值设置为公共属性,或者您在绑定中设置了错误的Path。
用你现在做的方式,你需要在每次BytesReceived更新时为Progress属性引发INotifyPropertyChanged的属性更改事件,因为这是你要绑定到的属性。