Xaml GridView没有';不显示项目异步加载程序,不显示´;t刷新项目
我正在开发Win8应用程序: 我有一个datasource类,它通过json从webservice获取项目:Xaml GridView没有';不显示项目异步加载程序,不显示´;t刷新项目,xaml,windows-8,windows-runtime,microsoft-metro,winrt-xaml,Xaml,Windows 8,Windows Runtime,Microsoft Metro,Winrt Xaml,我正在开发Win8应用程序: 我有一个datasource类,它通过json从webservice获取项目: public class DataSourceCapitulos { public ObservableCollection<capitulo> ListaCapitulos { get; set; } public DataSourceCapitulos() { CargarCapitulos(); } publi
public class DataSourceCapitulos
{
public ObservableCollection<capitulo> ListaCapitulos { get; set; }
public DataSourceCapitulos()
{
CargarCapitulos();
}
public async void CargarCapitulos()
{
var resourceUri = Cie10Uri.CapitulosUri;
HttpClient httpClient = new HttpClient();
bool error = false;
HttpRequestException exception = null;
try
{
string response = await httpClient.GetStringAsync(resourceUri);
ListaCapitulos = new ObservableCollection<capitulo>(JsonConvert.DeserializeObject<List<capitulo>>(response));
}
catch (HttpRequestException e)
{
error = true;
exception = e;
}
if (error)
{
MessageDialog adv = new MessageDialog(string.Format("La consulta {0}, devolvió:{1}", resourceUri, exception.Message), "No se pudo consultar!!! ");
adv.Commands.Add(
new UICommand("Ok")
);
await adv.ShowAsync();
}
}
}
公共类数据源capitulos
{
公共ObservableCollection ListaCapitulos{get;set;}
公共数据源capitulos()
{
CargarCapitulos();
}
公共异步void CargarCapitulos()
{
var resourceUri=Cie10Uri.CapitulosUri;
HttpClient HttpClient=新HttpClient();
布尔误差=假;
HttpRequestException异常=null;
尝试
{
字符串响应=等待httpClient.GetStringAsync(resourceUri);
ListaCapitulos=新的ObservableCollection(JsonConvert.DeserializeObject(response));
}
捕获(HttpRequestException e)
{
错误=真;
例外=e;
}
如果(错误)
{
MessageDialog adv=newmessagedialog(string.Format(“La consulta{0},devolvió:{1}”,resourceUri,exception.Message),“No se pudo consultar!!!”;
adv.Commands.Add(
新命令(“确定”)
);
等待adv.ShowAsync();
}
}
}
并有一个包含以下来源的XAML表单:
<Page.Resources>
<data:DataSourceCapitulos x:Key="DataSourceCapitulos"></data:DataSourceCapitulos>
</Page.Resources>
最后是一个GridView,其源项指向DataSourceCapitulos的ListaCapitulos属性,如下所示:
<GridView Grid.Column="1" Grid.Row="1" ItemsSource="{Binding Source={StaticResource DataSourceCapitulos},Path=ListaCapitulos}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Height="250" Width="250">
<Grid.Background>
<ImageBrush ImageSource="{Binding Imagen}"/>
</Grid.Background>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="90"/>
</Grid.RowDefinitions>
<Rectangle >
<Rectangle.Fill>
<SolidColorBrush Color="#FF122951" Opacity="0.6"/>
</Rectangle.Fill>
</Rectangle>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</GridView>
在此之前,我的应用程序运行没有问题,但问题是它没有显示teítems,甚至ListaCapitulos也像我预期的那样被填充
这是MainPage.xaaml.cs
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
/// <summary>
/// Se invoca cuando esta página se va a mostrar en un objeto Frame.
/// </summary>
/// <param name="e">Datos de evento que describen cómo se llegó a esta página. La propiedad Parameter
/// se usa normalmente para configurar la página.</param>
protected override void OnNavigatedTo(NavigationEventArgs e)
{
}
}
公共密封部分类主页面:第页
{
公共主页()
{
this.InitializeComponent();
}
///
///这是一个非常简单的框架。
///
///事件数据描述了cómo se llegóa esta página.La propiedad参数
///东南美国帕吉纳地区的标准配置。
受保护的覆盖无效OnNavigatedTo(NavigationEventArgs e)
{
}
}
我错过了什么 我认为视图(xaml表单)没有意识到通过此绑定进行的数据更改。
为什么要使用静态资源?
您可以直接将ListaCapitulos设置为girid的数据源,否则,您应该使用MVVM模型,并且应该了解您对属性更改的看法
ItemsSource=“{Binding listaCapitulos}
(ObservableCollection)DataSourceCapitulos
的实例,如DataSourceCapitulos ChaptersVm=newdatasourcecapitulos();
(作为成员,您需要多次访问它)DataContext
设置为该实例。您可以在C#,ChaptersGridView.DataContext=ChaptersVm
中执行此操作ListaCapitulos
中有章节,这意味着你没有正确地绑定它们以显示出来
另外,我看到async void CargarCapitulos()
是异步的,您在构造函数中调用它,但会同步运行。收集章节时,您的应用程序可能无法流畅运行
更新
虽然我对第一种方法不是很确定,但我可以想出两种方法,让调用cargarcapitulos
async
1) 在新方法中等待方法调用(我不太确定这是否会奏效):
在构造函数中:
public DataSourceCapitulos()
{
LoadCapitulos();
}
在loadcapitalulos
正文中,您有:
public async void LoadCapitulos()
{
//this awaits the chapters to load (you were missing await,
//but you can't use await in a constructor, so this is a work-around
await CargarCapitulos();
}
如果1)不起作用,请尝试2)这肯定会起作用,但您必须做一些更改:
2) 如果您对包含章节的集合进行了某些更改,则ObservableCollection将不会通知UI任何更新。为此,您必须使用INotifyPropertyChanged
界面并实现其成员。如果您使用Windows 8应用程序的高级模板,则在Common
文件夹中,您有一个名为BindableBase
-尝试通过继承直接使用它。此外,您必须在ObservableCollection
setter中使用OnPropertyChanged()
事件调用,以便在章节集合更改时,也将通过绑定更改UI:
public class DataSourceCapitulos : BindableBase
{
private ObservableCollection <capitulo> _listaCapitulos;
public ObservableCollection <capitulo> ListaCapitulos
{
get
{
return _listaCapitulos;
}
set
{
_listaCapitulos = value;
OnPropertyChanged(); //This notifies of changes of collection
}
}
公共类数据源capitulos:BindableBase
{
私人可观察收集(listaCapitulos);;
公共可观测收集列表
{
得到
{
返回(listaCapitulos);;
}
设置
{
_listaCapitulos=值;
OnPropertyChanged();//这会通知集合的更改
}
}
但是,如果没有BindableBase,只需实现INotifyPropertyChanged
,其余部分将与我之前编写的一样。通过这些提供通知的更改,即使在加载UI之后加载章节,也应在UI上显示
但是我想说的是,为了使通知更改生效,您应该实现它。否则,您可以使用一个简单的Capitulos列表(奇怪的西班牙语)代替可观察的收集。Tks谢谢你的帮助,也许是一些样本?我本来打算给你发送一个样本,但我看到了Vasile的更新。我想这没关系。Tks。你说得对,Vasile的样本很好。Tks对你的兴趣很大。我会多次这样做唯一不同的是源代码(webservice)还有异步方式来获取数据。也许你有一个样本吗?如果你是正确的,我的问题是异步调用。但是