0

내 WP8 앱에서 배경 전송 서비스와 LongListSelectorProgressBar과 함께 사용하여 DataTemplate 항목을 다운로드 진행 상황을 사용자에게 표시합니다. 문제는 ProgressBar이 실제 진행 상황을 나타내지는 않지만 계속 앞뒤로 점프합니다.LongListSelector에 포함 된 경우 ProgressBar의 동작이 잘못되었습니다.

여기 내 XAML입니다. LongListSelector 주기적으로 BackgroundTransferRequest 's의 목록을 접수에와 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 클래스 뒤에 코드에서 정기적으로 업데이트됩니다 :

Views.ItemsSource = BackgroundTransferService.Requests.ToList() 

이 문제는 경우에 LongListSelector에서 일어나는 많은 경우 하나 이상의 항목이 표시됩니다. 예를 들어 ListBox을 사용하려고하면 모든 것이 잘 작동합니다. 왜 이런 일이 일어나고 그것을 해결하기 위해 무엇을해야합니까? 나는 의견이 맞지 않을 수

+0

XAML을 가져 와서 문제를 다시 만들 수 없습니다. 잘 작동하는 것처럼 보였다. ProgressBar가 불확실한 모양입니까? ProgressBar.IsIndeterminate = false로 설정해보십시오. 아마 당신이보고있는 문제의 스크린 샷이 도움이 될까요? –

+0

그냥 생각났다 - LongListSelector.ItemsSource가 바인딩 된 개체 유형에 상관없이 클래스를 게시 할 수 있습니까? (BytesReceived 및 TotalBytesToReceive가있는 것) –

+0

@GaryJohnson, ProgressBar는 중간 단계가 아니며 진행률을 표시하지만 잘못 수행합니다. 한 순간에는 60 %, 다음 순간에는 30 %를 표시 할 수 있습니다. 바인딩 된 클래스는 BackgroundTransferRequest (http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh239291(v=vs.105).aspx)입니다. – Anton

답변

1

-이 시도 :

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에 바인딩 된 ObservableCollection입니다. 이 경우 수동으로 전혀 업데이트 할 필요가 없습니다. BackgroundTransferRequest 이벤트는 래퍼가 소품 변경 사항을 알리도록 유도합니다.

예제를 완전히 테스트하지는 않았지만 LongListSelector의 UI 가상화 및 ItemsSource를 계속 재설정하는 방식과 관련이 있다고 생각됩니다. 또 다른 가능성은 요청의 순서가 BackgroundTransferService에서 가져올 때마다 변경 될 수 있다는 것입니다.

행운을 빈다.