.net 添加后,绑定到Windows Phone MVVM中ObservableCollection的列表框数据不会更新
我在ViewModel中有一个ObservableCollection,当在视图中按下ApplicationBar按钮时,它会添加新条目。绑定到此ObservableCollection的列表框不显示新的/更新的条目,而是在应用程序加载时显示集合的项。ViewModel确实实现了INotifyPropertyChanged,并且在将项添加到ObservableCollection(or)集中时调用NotifyPropertyChanged ViewModel-根据从服务器读取的内容,将新项添加到可观察集合中.net 添加后,绑定到Windows Phone MVVM中ObservableCollection的列表框数据不会更新,.net,windows-phone-7,data-binding,listbox,observablecollection,.net,Windows Phone 7,Data Binding,Listbox,Observablecollection,我在ViewModel中有一个ObservableCollection,当在视图中按下ApplicationBar按钮时,它会添加新条目。绑定到此ObservableCollection的列表框不显示新的/更新的条目,而是在应用程序加载时显示集合的项。ViewModel确实实现了INotifyPropertyChanged,并且在将项添加到ObservableCollection(or)集中时调用NotifyPropertyChanged ViewModel-根据从服务器读取的内容,将新项添加到
public class MainViewModel : INotifyPropertyChanged
{
private ObservableCollection<SubsViewModel> _itemsUnread;
public ObservableCollection<SubsViewModel> UnreadItems
{
get
{
return _itemsUnread;
}
set
{
_itemsUnread = value;
NotifyPropertyChanged("Updated");
}
}
void reader_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case "Updated":
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
UnreadItems.Clear();
foreach (ItemViewModel subs in ItemsAll)
{
....
UnreadItems.Add(subs);
}
}
);
IsDataUpdated = true;
NotifyPropertyChanged(e.PropertyName);
break;
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String propertyName)
{
if (null != this.PropertyChanged)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
因此,在Dispatcher调用外部执行Add()确实有效。但现在的问题是,我使用回调从webservice获取新列表,在这里我将条目添加到unreaditems集合中。这是我在调度员之外做不到的
(web service) =callback=> ViewModel =observablecollection=> View
如何通知viewmodel在回调之外更新集合,而我不必使用dispather invoke?(或)使用dispatcher invoke,而不是通过跨线程引用崩溃
谢谢注意几点:
1) 根据,ObservableCollection已经为Silverlight实现了InotificationCollectionChanged,所以您不必重新实现它
2) 设置程序中的此代码:
NotifyPropertyChanged("Updated");
有一些问题:
a) 它仅在整个集合对象本身发生更改时执行,而不会在集合中的项发生更改时执行
b) 如果按您希望的方式实现了,则字符串参数应该是更改为UnreadItems
的属性
更新
我还怀疑(在下面的评论中指出)在
调用中添加项目会导致通知消息丢失。我建议更改代码以直接添加项,而不是在Invoke语句中添加项。应在构造函数中使用
UnreadItems=新的ObservableCollection()
请在使用前实例化可观察集合。
在MainViewModel的构造函数中
编写如下代码
公共主视图模型()
{
_itemsUnread=新的ObservableCollection();
}
功能读卡器\u属性更改
不需要实现
调用NotifyPropertyChanged
时,请使用属性名称作为参数,如
公共可观察收集未编辑项
{
得到
{
返回_itemsUnread;
}
设置
{
_itemsUnread=值;
NotifyPropertyChanged(“未编辑”);
}
}
在UnreadItems属性设置器中,为“Update”命名属性引发NotifyPropertyChanged,应为UnreadItems引发它。至少我认为这是问题所在。我现在明白了为什么你用Update调用它,也许这就是你处理属性更改事件的问题,所以它没有到达UI。是的,我理解上面两件事。他们被添加来尝试解决问题,但事实并非如此。我添加了NotifyPropertychanged,以防我为其分配新集合。但这里的情况并非如此。^^我的意思是,如果me没有显式调用NotifyPropertyChanged(“”),它也不会工作。@VasiS:好的。您是否已验证这些项实际上已添加到基础集合中?另外,您是否尝试过直接将项目添加到集合中而不是通过调用(我想知道属性更改通知是否在某个地方被吞没)?是的,UnderItems集合中确实包含更新的和新的项目。您是对的,在按下ApplicationBar按钮时添加新项目。我确实看到列表框显示了新项subviewmodel newitem=newsubviewmodel();newitem.itemTitle=“测试”;newitem.itemCount=测试_ItemsUnread.Add(新建项);测试++代码>他说他一开始就看到了原始值,所以他已经在代码的其他地方看到了。是的,它在MainViewModel的构造函数中初始化。我没有把代码复制到这里。是,收集的数据以相同的方式初始化2。reader_PropertyChanged是来自Web服务的回调,用于获取新的项目列表。在我看来,请执行第3步并重试。
(web service) =callback=> ViewModel =observablecollection=> View
NotifyPropertyChanged("Updated");