我有一個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事件處理程序的某種線程問題?
令人困惑的是一些列表顯示正確,有些不顯示。我一遍又一遍地瞭解代碼,並且在處理列表的方式之間找不到任何區別。
關於如何追蹤這個或我做錯了什麼想法?
注意,如果從多線程訪問'Instance'很可能應該將'instance'標記爲'votatile',以防止指針被CPU緩存在訪問器中。 – 2011-03-10 07:37:54
@Richard - 感謝我現在所做的提示。 – daveywc 2011-03-10 07:40:31
您是否確認數據是從WCF服務返回的,並且ObservableCollection肯定正在填充? – 2011-03-10 07:41:44