Xaml GridView没有';不显示项目异步加载程序,不显示´;t刷新项目

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

我正在开发Win8应用程序:

我有一个datasource类,它通过json从webservice获取项目:

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模型,并且应该了解您对属性更改的看法

  • 在XAML中,设置
    ItemsSource=“{Binding listaCapitulos}
    (ObservableCollection)

  • 在页面的C#文件中,您需要类
    DataSourceCapitulos
    的实例,如
    DataSourceCapitulos ChaptersVm=newdatasourcecapitulos();
    (作为成员,您需要多次访问它)

  • 将gridview(在XAML中应该显示章节的gridview)
    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)还有异步方式来获取数据。也许你有一个样本吗?如果你是正确的,我的问题是异步调用。但是