我在ObservableCollection中有一个DownloadOperation列表,该变量的属性为Progress.TotalBytesToReceive& Progress.BytesReceived。 当我试图将此属性绑定到max&进度条的值它给我绑定表达式错误属性没有找到。我绑定其他属性ResultFile.Name并成功。有没有办法解决这个问题?
更新:
我发现我需要使用转换器从进度中获取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>();
我试图提取BytesReceived&amp;代码中的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也工作正常,当我添加下载它自动更改视图而不必手动更新datacontext,如果下载完成/删除相同的结果。但是,如果我直接将Progress.BytesReceived绑定到进度条值,它会给我路径错误,但我能够将它绑定到Progress属性。所以我创建了一个转换器来检索值。
这是我用来转换Progress属性的Convereter:
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中检索它。或者我做错了吗?因为现在我遇到的问题是视图不知道bytesreceived值是变化的。
如果不可能,我应该使用INotifyPropertyChanged实现另一个视图模型吗?