【问题标题】:Binding Multiple Download Progress绑定多个下载进度
【发布时间】:2015-12-16 10:20:02
【问题描述】:

我在 ObservableCollection 中有一个 DownloadOperation 列表,并且该变量具有 Progress.TotalBytesToReceive 和 Progress.BytesReceived 属性。 当我尝试将此属性绑定到进度条的最大值和值时,它给了我绑定表达式错误属性未找到。我绑定了其他属性 ResultFile.Name 并且它成功了。有没有办法解决这个问题?

更新:

我发现我需要从进度中使用转换器来获取总字节值,但现在的问题是该值没有更新,并且似乎 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>

我有这个作为视图模型,activeDownloads 包含可观察下载的列表。

public ObservableCollection<DownloadOperation> activeDownloads = new ObservableCollection<DownloadOperation>();

我尝试在后面的代码中提取 BytesReceived 和 TotalBytesToReceive

        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 也可以正常工作,当我添加下载时,它会自动更改视图,而无需手动更新数据上下文,如果下载完成/删除,结果相同。但是,如果我直接将 Progress.BytesReceived 绑定到进度条值,它会给我路径错误,但我可以将它绑定到 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.xml 中检索它。还是我做错了?因为现在我遇到的问题是视图不知道接收到的字节值发生了变化。

如果不可能,我应该制作另一个实施 INotifyPropertyChanged 的​​视图模型吗?

【问题讨论】:

    标签: c# xaml windows-phone-8.1 windows-phone


    【解决方案1】:

    首先,您不需要使用转换器;绑定 Max 和 Value 属性会很好,但您可能没有将源值设为公共属性,或者您在绑定中设置了不正确的路径。

    按照您现在的操作方式,每次更新 BytesReceived 时,您都需要为 Progress 属性引发 INotifyPropertyChanged 的​​属性更改事件,因为这是您要绑定的属性。

    【讨论】:

    • 谢谢您的回答先生,我刚刚更新了我的查询。我希望它能更清楚地解释我的问题。我检查了 Progress 属性也是公开的元数据,谢谢之前
    • 您的 DownloadOperation 类需要实现 INotifyPropertyChanged 接口,并且当您更新 Progress 属性时,您需要为该属性引发 PropertyChanged 事件。
    • 我无权修改该类,因为它是 Windows.Networking.BackgroundTransfer API 的一部分。有没有可能访问这个类的方法?或者我应该使用 IBackgroundTransferOperation 和 IBackgroundTransferOperationPriority 来创建自己的课程?
    • 最好的办法可能是将 DownloadOperation 对象包装在实现 INotifyPropertyChanged 的​​自定义 ViewModel 类中。
    • 非常感谢您的帮助,我成功地包装了 DownloadOperation 类并在其上实现了 INotifyPropertyChanged,现在它可以工作了。欢呼:D
    猜你喜欢
    • 2022-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多