Wp7,C#在viewModel中完成下载后导航

时间:2012-02-14 13:56:10

标签: c# silverlight windows-phone-7 mvvm viewmodel

所以,我正在为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 :(得分:0)

我想我会尝试以不同的方式解决它。让您的LoginPage只处理登录,然后重定向到您的主页。

在您的视图模型中,对于主页面,您创建一个名为Loading的bool属性,您可以在异步调用期间将其设置为true。将此绑定到进度条的visible属性,以便在Loading为真时显示,使用转换器来处理bool - &gt;可见。加载数据后,您只需将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

答案 1 :(得分:0)

在任何异步中更新UI时,您可以按以下方式使用Dispatcher

Dispatcher.BeginInvoke(delegate

{

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

});

我认为这对你有用。