2011-03-12 97 views
0

到的ObservableCollection我有一个MainViewModel包含一个ObservableCollection的引用:绑定与MVVM光

public ObservableCollection<SomeClass> ListOfPeople 
{ 
    get 
    { 
     return MyClass.BaseCollection; 
    } 
} 

BaseCollection也就是ObservableCollection<SomeClass>一个实例。 ListOfPeople绑定到第二页上的ListBox控件 - 应用程序从第一页开始,启动下载过程以填充BaseCollection并在下载过程中切换到第二页。

问题是,当发生绑定时,BaseCollection为空,因此未填充ListBox。但是,即使下载过程完成,列表框仍保留为空。我假设这是因为BaseCollection没有通知有关集合的现有更改的正确实例,但我不确定。

BaseCollection里面有物品 - 我确认了。

有关如何解决此问题的任何建议?这里的任何人都可以通过MVVM Light绑定到ObservableCollection,就像我上面展示的那样?

回答

4

如果DONOT要实例在构造一个空ListOfPeople和使用这个实例数据库加载,你必须这样做:

ListOfPeople装载完成后,您MainViewModel必须调用RaisePropertyChanged("ListOfPeople");告诉视图数据已经改变。

背景:感谢ObservableCollection MyClass.BaseCollection.Add()更新了gui。只要MyClass.BaseCollection = new Obser...被调用,gui就没有更多的gui更新,因为gui提到MyClass.BaseCollection的旧竞争。 MVVM光 - RaisePropertyChanged()告诉GUI更新其参考一个新的集合

+0

实际上它像一个魅力一样工作 - 毕竟那里有MVVM Light的细微差别。谢谢! – 2011-03-12 05:44:47

+0

另一方面,用户将不得不等待一段时间,直到列表框中出现任何项目。另外,为什么你会使用ObservableCollection呢?即使使用简单的List <>并在下载完成时执行RaisePropertyChanged(..)也会执行相同的操作。 – 2011-03-12 06:11:47

+0

你今天节省了我的一天! – Signcodeindie 2011-06-20 16:05:36

3

我还没有在MVVM Light上工作过,所以很抱歉,如果有什么特定的事情,我错过了。

看着你实现,

public ObservableCollection<SomeClass> ListOfPeople 
{ 
    get 
    { 
     return MyClass.BaseCollection; 
    } 
} 

此代码应工作,这是绑定到这个源头控制应该得到PROPERT而不必担心在其中创建的可观察到的实例的实际源更新。

因此,这里唯一可能的问题可能是您的MyBase.BaseCollection在开始时为null。所以,如果你避免这种情况,并创建一个空的集合,你已经宣布这个可观察项目,然后触发你的下载过程,那么一切都应该正常工作。

希望这会有所帮助。

+0

我@同意去啦的回答,只需要在MyClass的constuctor实例化BaseCollection会解决这个问题。在这个绑定场景中,MVVMLight与此无关。 – 2011-03-12 05:05:37

+0

MVVM Light在那里供参考 - 只是确保没有实现细微差别。事情是 - MyClass是静态的,这很好 - 有一个静态构造函数,我可以在切换到第二个页面(因此绑定)之前初始化集合。在开始时,集合确实为null,但即使进行了初始化,它对它也没有任何影响。 – 2011-03-12 05:26:36