.net 添加后,绑定到Windows Phone MVVM中ObservableCollection的列表框数据不会更新

.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-根据从服务器读取的内容,将新项添加到

我在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");