3

我正在使用 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

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

4

1 回答 1

1

您可以稍微修改您的方法以使用数据绑定和 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}"用于您希望在其上显示此值的控件。(例如文本块)
  7. 现在,每当您向集合中添加元素时,它都会反映在 UI 中,反之亦然
于 2014-03-11T15:35:01.303 回答