2013-06-23 81 views
0

我正在開發一個應用程序在Win8:GridView控件不顯示異步加載項,doesn't刷新項目

我有一個通過JSON採取項目從Web服務數據源類:

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與它的指向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> 

直到這裏我的應用程序運行時沒有問題,但問題是它沒有顯示項目,即使是我期望的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) 
    { 
    } 
} 

也有一些是我在想念?

回答

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

  2. 在頁面的C#文件中,您需要一個類DataSourceCapitulos的實例,如DataSourceCapitulos ChaptersVm = new DataSourceCapitulos();(作爲成員,您需要多次訪問它)。

  3. 將gridview的(您在XAML中應該顯示章節的那個)設置爲DataContext。你可以在C#中做到這一點,ChaptersGridView.DataContext = ChaptersVm

你是說,你知道你有章節ListaCapitulos,這意味着你沒有正確地約束他們要顯示。

此外,我看到async void CargarCapitulos()是爲了異步,你是在構造函數中調用它,但會同步運行。收集章節時,您的應用可能無法流暢運行。

UPDATE

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應用程序的高級模板,在Common文件夾中,您有一個名爲BindableBase的類 - 嘗試直接通過繼承它來使用它。此外,您必須使用ObservableCollection二傳手的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 
     } 
    } 

但是,如果你不具備BindableBase,只是實施INotifyPropertyChanged其餘的將看起來就像我以前寫的。通過這些提供通知的更改,章節應該在UI上顯示,即使它們稍後加載,UI加載後也是如此。

但我會說你應該實施它的通知更改有任何影響。否則,你可以使用一個簡單的Capitulos列表(怪異的西班牙語)而不是Observable Collection。

+0

我會多次練習這個練習,唯一的新東西是源(webservice)和異步獲取數據的方式。也許你有樣品? Tks很多 –

+0

你是可靠的,我的問題是異步調用。但真的不知道如何解決它。如果你有任何想法,會非常讚賞。 –

+0

我已經更新了我的答案,我希望它有幫助。 – VasileF

0

我認爲視圖(xaml表單)沒有意識到通過此綁定進行的數據更改。 爲什麼你使用靜態資源? 您可以直接將ListaCapitulos設置爲girid的數據源,否則,您應該使用MVVM模型,並且您應該知道您對屬性更改的看法。

+0

Tks爲您的幫助,也許一些樣品? –

+0

我打算給你發一個樣品,但是我看到了Vasile的更新。我認爲這是好的。 – Masoud

+0

Tks。 Vasile的示範作品很棒。非常感謝您的關注。 –