Xaml ProgressBar包含在LongListSelector中时行为不正确

Xaml ProgressBar包含在LongListSelector中时行为不正确,xaml,progress-bar,windows-phone-8,longlistselector,background-transfer,Xaml,Progress Bar,Windows Phone 8,Longlistselector,Background Transfer,在我的WP8应用程序中,我使用后台传输服务和LongListSelector以及ProgressBar作为DataTemplate向用户显示项目下载进度。问题是,ProgressBar并没有显示真正的进度,而是不断地来回跳跃 这是我的XAMLLongListSelector定期接收BackgroundTransferRequest的列表和使用 ProgressBar要显示它们: <phone:LongListSelector IsGroupingEnabled="False" x:Name

在我的WP8应用程序中,我使用后台传输服务和
LongListSelector
以及
ProgressBar
作为
DataTemplate
向用户显示项目下载进度。问题是,
ProgressBar
并没有显示真正的进度,而是不断地来回跳跃

这是我的XAML
LongListSelector
定期接收
BackgroundTransferRequest
的列表和使用
ProgressBar
要显示它们:

<phone:LongListSelector IsGroupingEnabled="False" x:Name="Views">
    <phone:LongListSelector.ListHeader>
        <StackPanel Style="{StaticResource M20}">
            <controls:TextTile Txt="Cancel downloads" Sign="x" Tap="CancelDownloads" />
        </StackPanel>
    </phone:LongListSelector.ListHeader>
    <phone:LongListSelector.ItemTemplate>
        <DataTemplate>
            <ProgressBar Maximum="{Binding TotalBytesToReceive}" Value="{Binding BytesReceived}" Minimum="0" />
        </DataTemplate>
    </phone:LongListSelector.ItemTemplate>
</phone:LongListSelector>  

只有在显示多个项目的情况下,
LongListSelector
才会出现此问题。例如,如果我尝试使用
ListBox
,一切都正常。为什么会发生这种情况?我应该怎么做才能解决它?

我无法在评论中说明这一点--请尝试以下方法:

public class BackgroundTransferRequestWrapper : INotifyPropertyChanged {

    private BackgroundTransferRequest _request;

    public BackgroundTransferRequestWrapper(BackgroundTransferRequest request) {
        _request = request;
        _request.TransferProgressChanged += OnTransferProgressChanged;
    }

    private void OnTransferProgressChanged(object sender, BackgroundTransferEventArgs e) {
        BytesReceived = _request.BytesReceived;
        TotalBytesToReceive = _request.TotalBytesToReceive;
    }

    private long bytesReceived = 0;
    public long BytesReceived {
        get { return bytesReceived; }
        set {
            bytesReceived = value;
            OnPropertyChanged();
        }
    }

    private long totalBytesToReceive = 0;
    public long TotalBytesToReceive {
        get { return totalBytesToReceive; }
        set { totalBytesToReceive = value;
        OnPropertyChanged();}
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }
}
与其在计时器上重置ItemsSource,不如执行以下操作:

    foreach (var request in BackgroundTransferService.Requests) {
        Requests.Add(new BackgroundTransferRequestWrapper(request));
    }
在本例中,请求是绑定到ItemsSource的可观察集合。这样,您根本不需要手动更新——BackgroundTransferRequest事件将驱动包装器在发生道具更改时通知它们

我没有完全测试您的示例,但我怀疑您的问题与LongListSelector的UI虚拟化以及您不断重置ItemsSource的方式有关。另一种可能性是,每次从BackgroundTransferService获得请求时,请求的顺序可能会改变


祝你好运

我接受了您的XAML,无法重新创建问题。它似乎工作得很好。ProgressBar看起来不确定吗?尝试设置ProgressBar.IsIndeterminate=false。也许你看到的问题的屏幕截图会有所帮助?我有个想法——你能为LongListSelector.ItemsSource绑定到的任何类型的对象发布类吗?(上面有BytesReceived和TotalByTestorReceive的东西)@GaryJohnson,ProgressBar不是中间的,它确实显示了进度,但做得不正确:在某一时刻它可以显示60%,在下一时刻显示30%,依此类推。它绑定到的类是BackgroundTransferRequest()
    foreach (var request in BackgroundTransferService.Requests) {
        Requests.Add(new BackgroundTransferRequestWrapper(request));
    }