Wp7,C#在viewModel中完成下载时进行导航
本文关键字:下载 导航 viewModel Wp7 | 更新日期: 2023-09-27 18:24:38
所以,我正在为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));
});
我想这对你很好。