我正在使用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
。
任何帮助表示赞赏。感谢。
答案 0 :(得分:1)
您可以稍微修改一下方法,使用Data Binding和MVVM模型将模型绑定到您的视图。
最初可能看起来有点费力,但以后会节省很多调试时间。
请按照以下步骤
添加以下方法实现
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (null != handler)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
添加public ObservableCollection<TodoItem> TodoItems{ get; private set; }
并在构造函数中初始化它。
ItemsSource="{Binding TodoItems}"
添加到列表中。ItemsSource="{Binding Text}"
作为您希望显示此值的控件。 (例如TextBlock)