绑定多个下载进度

本文关键字:下载 绑定 | 更新日期: 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的属性更改事件,因为这是你要绑定到的属性。