Windows Phone 7数据绑定时序问题

时间:2011-03-10 07:00:39

标签: data-binding windows-phone-7 observablecollection

我有一个Windows Phone 7应用程序,它有一个本地"数据库"可观察的集合,持久存储到隔离存储。当应用程序首次运行时,它会检查是否存在任何数据,如果没有数据,则它从WCF服务检索数据并将其加载到可观察集合中。计时器每隔10秒将数据从可观察集合刷新到隔离存储。我只是对应用程序进行原型设计,因此我认为我将使用数据绑定在枢轴控件中的一些简单列表中显示来自可观察集合的数据。我遇到的问题是,在从WCF服务检索数据的初始场景中,一些列表显示了他们的数据而一些列表没有显示。 (有6个列表,似乎一致,相同的2不显示他们的数据)。如果我然后关闭应用程序并重新打开它,则所有列表都会按预期显示其数据。不同之处在于,现在数据只是从隔离存储中加载到可观察集合中 - 不必从WCF服务中检索它。

包含可观察集合的类看起来像:

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

此事件位于Database类中。

问题是否可能与OpenReadCompleted事件处理程序有某种类型的线程问题?

令人困惑的是,有些列表显示正确而有些列表没有显示。我已经遍及代码,无法找到如何处理列表之间的任何差异。

有关如何追踪此事或我做错了什么的想法?

2 个答案:

答案 0 :(得分: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");
   }
} 

答案 1 :(得分:1)

为什么每隔10秒钟冲洗一次?你只需要一系列事件

  1. 如果在iso store goto end中获取数据

  2. 下载列表1异步

  3. 的设置回调
  4. 调用下载列表1 async

  5. 回调下载列表1异步 - 将数据保存到iso商店

  6. 为每个列表重复步骤1到3

    端。从iso商店加载列表