GridView不显示项目异步加载器,不刷新项目

时间:2013-06-23 05:24:59

标签: xaml windows-8 windows-runtime microsoft-metro winrt-xaml

我正在开发一个Win8应用程序:

我有一个数据源类,通过json从webservice获取temtem:

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();
        }
    }
}

并且有一个包含此源的XAML表单:

<Page.Resources>
    <data:DataSourceCapitulos x:Key="DataSourceCapitulos"></data:DataSourceCapitulos>
</Page.Resources>

最后一个GridView,它的源ítems指向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)
    {
    }
}

有什么我错过的?

2 个答案:

答案 0 :(得分:1)

  1. 在XAML中,设置ItemsSource="{Binding listaCapitulos}(ObservableCollection)。

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

  3. 为该实例设置gridview(在XAML中应该显示章节的那个)DataContext。您可以使用C#,ChaptersGridView.DataContext = ChaptersVm

  4. 执行此操作

    你说你知道你有ListaCapitulos中的章节,这意味着你没有正确绑定它们以便显示。

    另外,我看到async void CargarCapitulos()意味着异步,你在构造函数中调用它,但会同步运行。在收集章节时,您的应用可能无法流畅运行。

    更新

    Altough我不太确定第一种方式,我可以想到两种方法可以保持Cargar Capitulos异步调用。

    1)在一个新方法中等待方法调用(我不太确定这会做什么):

    在构造函数中:

    public DataSourceCapitulos()
    {
        LoadCapitulos();
    }
    

    你身在LoadCapitulos身体的地方:

    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 App的高级模板,则在Common文件夹中,您有一个名为BindableBase的类 - 尝试通过继承它来直接使用它。此外,您必须在OnPropertyChanged() setter中使用ObservableCollection事件调用,以便在更改章节集合时,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
            }
         }
    

    但是,如果你没有BindableBase,只需实现INotifyPropertyChanged,其余的就像我之前写的那样。通过这些提供通知的更改,这些章节应该在UI上显示,即使它们是在以后加载UI之后加载的。

    但是我会说你应该实现它以使通知更改产生任何影响。否则,你可以使用一个简单的Capitulos列表(怪异的西班牙语)而不是Observable Collection。

答案 1 :(得分:0)

我认为视图(xaml表单)没有通过此绑定了解数据更改。 为什么使用静态资源? 你可以直接将ListaCapitulos设置为girid的数据源,否则你应该使用MVVM模型,你应该知道你对属性变化的看法。