2012-02-14 2 views
1

그래서 wp7 용 앱을 만들고 있습니다. 간단하게하기 위해 이 내 파일은 다음과 같습니다Wp7, C# viewModel에서 다운로드가 완료되면 탐색합니다

  • LoginPage.xaml합니다 (starup 페이지)
  • 에서 MainPage.xaml
  • MainViewModel.cs
  • ItemViewModel.cs

에서이 MainViewModel.cs 나는 folowing 함수를 포함했다 :

private void DownloadItems() 
    { 
     string key = this.User.Key; 
     WebClient wc = new WebClient(); 
     wc.DownloadStringCompleted += callback; 
     wc.DownloadStringAsync(new Uri("http://localhost/items?key=" + key)); //JSON 
    } 

및 콜백 기능 :

private void callback(object sender, DownloadStringCompletedEventArgs e) 
    { 
     if (e.Error == null) 
     { 
      List<ItemViewModel> col = Deserialize_ItemViewModel(e.Result); // deserialize JSON to List<ItemViewModel> 
      this.Items = new ObservableCollection<ItemViewModel>(col); 
      ItemDB.Sponsors.InsertAllOnSubmit(col); 
      ItemDB.SubmitChanges(); 
      this.IsDataLoaded = true; 
      // ??? 
     } 
    } 

로그인에서 사용자 로그를 처리하고 모든 확인 DownloadItems가 새롭게 설정 User.Key을 사용하고있는 호출 될 때합니다.

내가 필요한 것은 다운로드가 진행되는 동안 ProgressIndicator를 표시하고 다운로드가 완료되어 처리되면 해당 시간까지 준비 될 MainPage.xaml로 이동하려고합니다.

누구든지 저를 도울 수 있기를 바랍니다. 미리 감사드립니다!

답변

0

나는 그것을 다르게 해결하려고 할 것이라고 생각합니다. 로그인 페이지 만 로그인을 처리 한 다음 기본 페이지로 리디렉션하십시오.

보기 모델에서 기본 페이지의 경우 비동기 호출 중에 true로 설정할 수있는 Loading과 같은 이름의 bool 속성을 만듭니다. 이것을 진도 표시 줄의 visible 속성에 바인딩하여 Loading이 true 일 때 변환기를 사용하여 bool -> visible을 처리합니다. 데이터가로드되면 Loading을 false로 설정하면 진행률 표시 줄이 사라집니다. 동시에 컨트롤 /보기의 visible 속성을 Loading으로 바인딩하지만 진행률 표시 줄에 대한 변환기의 반전 된 값인 다른 변환기를 사용합니다.

희망이 도움이 될 것입니다.

업데이트 : 나는 이미 IsDataLoaded을보고 싶었습니다.보기 모델에 있습니까? 이 같은 사용해서

public class VisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, 
       CultureInfo culture) 
    { 
     if (value != null && value is bool && parameter != null) 
     { 
      var bValue = (bool) value; 
      var visibility = (Visibility)Enum.Parse(
      typeof (Visibility), parameter.ToString(),true); 
      if (bValue) return visibility; 
      return visibility == 
      Visibility.Visible ? Visibility.Collapsed : Visibility.Visible; 
     } 

     return null; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, 
        CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

:

Visibility="{Binding IsDownloading, Converter={StaticResource VisibilityConverter}, ConverterParameter=Visible}" 

예제 코드에서 가져온 것입니다 : 컨버터처럼 보일 것이다 당신이 어떤 비동기의 UI를 업데이트 할 때 http://dotnetbyexample.blogspot.com/2010/11/converter-for-showinghiding-silverlight.html

+0

내 응용 프로그램에서 작동 할 것이라고 생각하지만 내 viewmodel에서 비 정적 기능 (탐색 기능)을 호출 할 수 있는지 또는이 변수가 업데이트 될 때 알 수 있습니까? – Qurben

+0

배경 스레드에서 UI 스레드를 호출하는 방법은 Pavan의 다른 답변을 참조하십시오. 그러나 내가 제공 한 솔루션을 사용하면 필요 없다고 생각합니다. –

+0

@Qurben, 당신은 viewmodel에서, 즉 탐색 기능을 호출해서는 안됩니다. 뷰 모델은 탐색과 관련이 없으며 뷰의 모델입니다. 뷰 모델은 변경된 속성에 플래그를 지정하여 무언가가 주변으로 변경되었다는 것을 알려주고 해당 변경 사항을 처리하는 것은 주변 환경에 달려 있습니다. 최상의 플로우는 아마도 다음과 같습니다. 페이지로 이동하여 데이터가로드 될 때까지 임시보기를 표시하십시오. 데이터가로드되면 예상보기가 표시됩니다. –

0

, 당신은에서 Dispatcher를 사용 다음의 방법

Dispatcher.BeginInvoke(delegate 

{ 

NavigationService.Navigate(new Uri("/Folder/pagename.xaml", UriKind.Relative)); 

}); 

나는 그것이 당신에게 갈라진다라고 생각한다.

+0

페이지 자체의 콜백 함수에서 그렇게 할 수 있지만 내 viewmodel에서 Dispatcher를 사용할 수는 없다는 것을 알고 있습니다. 훨씬 비싸기 때문에 모든 비동기 항목을 페이지로 옮길 것입니다. – Qurben

관련 문제