2011-03-10 39 views
1

我有一個Windows Phone 7應用程序,它有一個可觀察集合的本地「數據庫」,它被持久化到獨立存儲。當應用程序首次運行時,它會檢查是否存在任何數據,如果沒有數據,則會從WCF服務中檢索數據並將其加載到可觀察集合中。定時器每10秒將可觀察集合的數據刷新到獨立存儲。我只是原型應用程序,所以我認爲我會顯示數據綁定控件中使用數據綁定的一些簡單列表中的可觀察集合的數據。我遇到的問題是,在從WCF服務中檢索數據的初始場景中,一些列表顯示了他們的數據,而另一些卻沒有。 (有6個列表,看起來一致,相同的2不顯示他們的數據)。如果我然後關閉應用程序並重新打開它,那麼所有列表都按預期顯示它們的數據。不同之處在於,現在數據只是從獨立存儲裝載到可觀察集合中 - 它不必從WCF服務中檢索。Windows Phone 7的數據綁定時機問題

持有的觀察集合類的樣子:

public sealed class Database : INotifyPropertyChanged 
{ 
    //Declare Instance 
    private static Database instance;// = new Database(); 
    private static object syncRoot = new Object(); 

    //Private Constructor 
    private Database() 
    { 
     Categories = new ObservableCollection<Category>(); 
     CategoryTypes = new ObservableCollection<CategoryType>(); 
     Customers = new ObservableCollection<Customer>(); 
     Tasks = new ObservableCollection<Task>(); 
     TimePeriods = new ObservableCollection<TimePeriod>(); 
     RecentTasks = new ObservableCollection<RecentTask>(); 
    } 

    /// <summary> 
    /// The entry point into this Database 
    /// </summary> 
    public static Database Instance 
    { 
     get 
     { 
      if (instance == null) 
      { 
       lock (syncRoot) 
       { 
        if (instance == null) 
        { 
         //custom code 
         instance = new Database(); 
        } 
       } 
      } 

      return instance; 
     } 
    } 

    #region Properties 

    public ObservableCollection<Category> Categories { get; set; } 
    public ObservableCollection<CategoryType> CategoryTypes { get; set; } 
    public ObservableCollection<Customer> Customers { get; set; } 
    public ObservableCollection<Task> Tasks { get; set; } 
    public ObservableCollection<TimePeriod> TimePeriods { get; set; } 
    public ObservableCollection<RecentTask> RecentTasks { get; set; }..... 

現在看來似乎是某種形式的通知或時間問題,但我在努力追查。

我設置顯示的數據作爲PAGE_LOADED事件如下頁面的數據上下文:

this.DataContext = Database.Instance; 

的列表框之一的XAML看起來像:

<ListBox x:Name="AllTasksListBox" 
        Margin="0,0,-12,0" 
        ItemsSource="{Binding Tasks}" 
        DisplayMemberPath="Name"> 
</ListBox> 

之一將WCF服務中的數據加載到可觀察集合中的事件如下所示:

void OpenReadCompletedTasks(object sender, OpenReadCompletedEventArgs e) 
    { 
     DataContractSerializer ser = null; 

     try 
     { 
      ser = new DataContractSerializer(typeof(ObservableCollection<Task>)); 
      Database.Instance.Tasks = ser.ReadObject(e.Result) as ObservableCollection<Task>; 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 

This事件位於Database類中。

問題是否有可能是OpenReadCompleted事件處理程序的某種線程問題?

令人困惑的是一些列表顯示正確,有些不顯示。我一遍又一遍地瞭解代碼,並且在處理列表的方式之間找不到任何區別。

關於如何追蹤這個或我做錯了什麼想法?

+0

注意,如果從多線程訪問'Instance'很可能應該將'instance'標記爲'votatile',以防止指針被CPU緩存在訪問器中。 – 2011-03-10 07:37:54

+0

@Richard - 感謝我現在所做的提示。 – daveywc 2011-03-10 07:40:31

+0

您是否確認數據是從WCF服務返回的,並且ObservableCollection肯定正在填充? – 2011-03-10 07:41:44

回答

2

負載名單,我認爲這個問題是在你現在的樣子更新ObservableCollection

ObservableCollection將提供當你添加/刪除/修改個別條目的通知。

但是,當您替換整​​個集合時,則需要通知偵聽器整個集合已更改 - 否則它們將保持綁定到舊集合 - 例如,實現爲:

private ObservableCollection<Task> _tasks; 
public ObservableCollection<Task> Tasks 
{ 
    get 
    { 
     return _tasks; 
    } 
    set 
    { 
     _tasks = value; 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs("Tasks"); 
    } 
} 
+0

Thankyou - 這非常有意義並解決了問題。如果沒有這個列表,有些列表確實有效,這仍然有點奇怪。 – daveywc 2011-03-10 10:57:40

1

爲什麼你每10秒沖洗一次存儲?你只需要事件的序列

  1. 如果ISO商店轉到了數據結束的下載列表1個異步

  2. 調用下載列表1個異步

  3. 回調

  4. 設置回調下載列表1 async - 將數據保存到iso存儲區

爲每個列表重複步驟1至3

結束。從ISO商店

+0

我每隔10秒刷新一次存儲以模仿像SQLCE這樣的嵌入式數據庫的行爲。在設備故障的情況下,該想法將持續保持數據。電池耗盡。 – daveywc 2011-03-10 10:59:12

+0

必須有某些事件可用於刷新數據。每10秒不會沖洗會影響性能? – 2011-03-10 19:15:08