Wp7,C#在viewModel中完成下载时进行导航



所以,我正在为wp7制作一个应用程序。简单地说,这些是我的文件:

  • LoginPage.xaml(启动页面)
  • 主页.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;
            // ???
        }
    }

当用户登录时,登录将被处理,当一切正常时,将使用新设置的user.Key.调用DownloadItems

我需要的是在下载时显示ProgressIndicator,当下载完成并处理时,我想导航到MainPage.xaml,届时它将准备就绪。

我希望任何人都能帮助我,提前谢谢!

我想我会尝试以不同的方式解决它。让您的登录页面只处理登录,然后您将直接进入主页。

在视图模型中,对于主页,您创建了一个名为Loading的bool属性,可以在异步调用期间将其设置为true。将其绑定到进度条的visible属性,以便在Loading为true时显示,使用转换器处理bool->visible。加载数据时,您只需将Loading设置为false,这将导致进度条消失。同时,您也将控件/视图的可见属性绑定到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

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

Dispatcher.BeginInvoke(delegate
{
 NavigationService.Navigate(new Uri("/Folder/pagename.xaml", UriKind.Relative));
});

我想这对你很好。

最新更新