Wp7, C # Навигация после завершения загрузки в viewModel - PullRequest
1 голос
/ 14 февраля 2012

Итак, я делаю приложение для wp7. Проще говоря, это мои файлы:

  • LoginPage.xaml (стартовая страница)
  • MainPage.xaml
  • MainViewModel.cs
  • ItemViewModel.cs

В MainViewModel.cs я включил следующую функцию:

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, который к этому времени будет готов.

Надеюсь, кто-нибудь может мне помочь, заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 15 февраля 2012

когда вы обновляете пользовательский интерфейс в любом асинхронном режиме, вы используете Dispatcher следующим образом

Dispatcher.BeginInvoke(delegate

{

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

});

Я думаю, что он вам помогает.

0 голосов
/ 14 февраля 2012

Я думаю, я бы попытался решить это по-другомуПусть ваш LoginPage обрабатывает только вход, затем вы перенаправляете на свою главную страницу.

В вашей модели представления для главной страницы вы создаете свойство bool, называемое чем-то вроде Loading, которое вы можете установитьво время вашего асинхронного вызова.Свяжите это с видимым свойством индикатора выполнения, чтобы оно показывало, когда Loading истинно, используйте конвертер для обработки 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}"

Пример кода взят из: http://dotnetbyexample.blogspot.com/2010/11/converter-for-showinghiding-silverlight.html

...