2014-02-28 59 views
0

我一直試圖讓Windows Phone中/ C#編程開始,之後更新LongListSelector問題開始是應該去拉一些數據庫的數據從我的服務器,並相應地顯示一切一個小項目在我的手機上。我一直在使用Channel 9指南和Google/StackOverflow作爲指導,迄今爲止效果很好,但現在我遇到了一個我無法完全理解並需要幫助的問題。與重新分配源頭上反序列化JSON集合

我有一個應該是有點像MainViewModelClass,看起來像這樣一類PlanModel:

public class PlanModel 
{ 
    public PlanModel() 
    { 
     Items = new ObservableCollection<PlanData>(); 
    } 

    public ObservableCollection<PlanData> Items { get; set; } 
    public bool IsDataLoaded { get; set; } 

    public void LoadData() 
    { 
     LoadPlanData(); 

     IsDataLoaded = true; 
    } 

    public async Task LoadPlanData() 
    { 
     // URL censored, the JSON is deserialized correctly, checked with debug 
     Uri ApiAddress = new Uri("http://example.com"); 

     WebClient Client = new WebClient(); 
     Client.DownloadStringCompleted += Client_DownloadStringCompleted; 
     Client.DownloadStringAsync(ApiAddress); 
    } 

    void Client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 
     string ApiResult; 

     if (e.Error == null) 
     { 
      ApiResult = e.Result; 
      Items = JsonConvert.DeserializeObject<ObservableCollection<PlanData>>(ApiResult);  
     } 
    } 
} 

我App.xaml.cs被鏈接並工作正常,我只是修改了存在的版本當你創建一個新的項目。我認爲,我必須沿着這些線路不知何故什麼實現INotifyChanged屬性,但我嘗試了十幾個組合(名單,與OnCollectionChanged和OnPropertyChanged ObservableCollections)並沒有什麼實際運行時加載的異步數據更新時,我的主要頁面視圖。

我真的很感激,如果有人可以給我一個例子就如何正確地使視圖更新一個小的解釋 - 在此先感謝!

回答

0

爲了獲得一時的任務的東西,你不需要它的這個簡單的例子。

試試這個:(我已經實現了基本的東西INotifyPropertyChanged的你看

 public class PlanModel : INotifyPropertyChanged 
{ 
    public PlanModel() 
    { 
    } 

    public ObservableCollection<PlanData> Items { get; set; } 
    public bool IsDataLoaded { get; set; } 

    public void LoadData() 
    { 
     Items = new ObservableCollection<PlanData>(); 
     this.OnPropertyChanged("Items"); 

     LoadPlanData(); 

    } 

    public void LoadPlanData() 
    { 
     // URL censored, the JSON is deserialized correctly, checked with debug 
     Uri apiAddress = new Uri("http://example.com"); 


     // Web client is disposable, so wrap in a using statment to ensure clean up. 
     WebClient client = new WebClient(); 
     client.DownloadStringCompleted += Client_DownloadStringCompleted; 
     client.DownloadStringAsync(apiAddress); 
    } 

    void Client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 
     string ApiResult; 

     if (e.Error == null) 
     { 
      ApiResult = e.Result; 
      var itemsFromService = JsonConvert.DeserializeObject<ObservableCollection<PlanData>>(ApiResult); 

      foreach (var planDataItem in itemsFromService) 
      { 
       this.Items.Add(planDataItem); 
      } 

      IsDataLoaded = true; 
     } 
    } 

    // INotifyPropertyChanged implementation 
    public void OnPropertyChanged(string propertyName) 
    { 
     var handler = this.PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 
+0

Web客戶端似乎並不爲一次性的了 - 我已經嘗試實現這一點,但沒有奏效。 ,因爲Web客戶端不能轉換爲IDisposable的含蓄,智能感知,也沒有表現出處置,所以無論是我有一個非常愚蠢的錯誤的地方,或者不能再配置。 但除此之外,感謝您的幫助!您幫助我終於理解了這些更新的處理程序。 –

+0

WebClient是一次性花花公子。它必須被賦予它的操作 – John

+0

在[這個線程](http://stackoverflow.com/questions/4444 851/should-webclient-instances-be-reused-in-silverlight)在第二個答案的評論部分中討論了這個問題。我正在爲WinPhone 8編譯它。使用聲明只是給我一個錯誤,因爲它不是一次性的。 –

0

而是列表設置爲對象的新名單,你應該列表添加到您的觀察的名單。

像:

foreach(var item in JsonConvert.DeserializeObject<ObservableCollection<PlanData>>(ApiResult)) 
{ 
    Items.Add(item); 
} 

如果你只是將列表設置爲一個新的列表中的觀測將不會被觸發。

如果你需要增加新的使用之前清除列表:

Items.Clear(); 

/邁克爾