【发布时间】: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