列表框并不总是使用Windows Azure MobileServiceCollection和WP8添加项目

时间:2013-09-21 15:00:32

标签: azure windows-phone-8 listbox push-notification azure-mobile-services

我正在使用Windows Azure移动服务在我的Windows Phone 8应用中存储和检索数据。这是一个复杂的问题,所以我会尽力解释它。

首先,我使用原始推送通知来接收消息,当它收到消息时,它会更新我的应用程序中的列表框。当我打开我的应用时,导航到包含ListBox的页面,并收到推送通知,ListBox更新正常。如果我按回,然后导航到同一页面ListBox,收到推送通知,更新ListBox的代码执行时没有错误ListBox不更新。我已经检查过在两种情况下都使用OnNavigatedTo处理程序运行相同的代码,但是当我按下然后重新导航到同一代码时,ListBox似乎没有在第二个实例中正确绑定页。以下是一些代码段:

MobileServiceCollection声明:

public class TodoItem
{
    public int Id { get; set; }

    [JsonProperty(PropertyName = "text")]
    public string Text { get; set; }

}

private MobileServiceCollection<ToDoItem, ToDoItem> TodoItems;
private IMobileServiceTable<TodoItem> todoTable = App.MobileService.GetTable<TodoItem>();

推送通知已接收处理程序:

void PushChannel_HttpNotificationReceived(object sender, HttpNotificationEventArgs e)
    {
        string message;

        using (System.IO.StreamReader reader = new System.IO.StreamReader(e.Notification.Body))
        {
            message = reader.ReadToEnd();
        }


        Dispatcher.BeginInvoke(() =>
          {

              var todoItem = new TodoItem
              {
                Text = message,
              };
              ToDoItems.Add(todoItem);

           }
    );

     }

我尝试过使用:

ListItems.UpdateLayout();

ListItems.ItemsSource = null;
ListItems.ItemsSource = ToDoItems; 

在上述过程中添加ToDoItem的代码之前和之后,但它没有帮助。

在我的OnNavigatedTo事件处理程序中调用以下过程,并刷新Listbox并将ToDoItems指定为项目来源:

private async void RefreshTodoItems()
    {       
        try
        {
            ToDoItems = await todoTable
                .ToCollectionAsync();
        }
        catch (MobileServiceInvalidOperationException e)
        {
            MessageBox.Show(e.Message, "Error loading items", MessageBoxButton.OK);
        }

        ListItems.ItemsSource = ToDoItems;                      

    }

以上程序为async但我确保在收到任何通知之前完成。即使这样,如上所述,当我打开应用程序时,导航到显示ListBox它正常更新的页面。当我按下时,再次导航到同一页面,它不起作用。当我退出应用程序时,重新打开它,导航到包含ListBox的页面,它再次起作用,然后如果我按下并重新打开页面则会失败。因此,当我按下并导航到同一页面时,ListBox似乎没有正确绑定到ToDoItems

任何帮助表示赞赏。感谢。

1 个答案:

答案 0 :(得分:1)

您可以稍微修改一下方法,使用Data Binding和MVVM模型将模型绑定到您的视图。

最初可能看起来有点费力,但以后会节省很多调试时间。

请按照以下步骤

  1. 创建一个实现INotifyPropertyChanged的新类
  2. 添加以下方法实现

    public event PropertyChangedEventHandler PropertyChanged;
            private void NotifyPropertyChanged(String propertyName)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (null != handler)
                {
                    handler(this, new PropertyChangedEventArgs(propertyName));
                }
            }
    
  3. 添加public ObservableCollection<TodoItem> TodoItems{ get; private set; }并在构造函数中初始化它。

  4. 每个PhoneApplicationPage都有一个DataContext成员。将它分配给您创建的上述类的单例实例。
  5. 在XAML中,将属性ItemsSource="{Binding TodoItems}"添加到列表中。
  6. 在列表的DataTemplate中,使用ItemsSource="{Binding Text}"作为您希望显示此值的控件。 (例如TextBlock)
  7. 现在每当您向集合添加元素时,它都会反映在用户界面中,vice-versa