如何替换静态ObservableCollection,以便它可以在MVVM方式的所有窗口上访问

Atm我得到了一个带有静态ObservableCollection的类(somerandomclasss):

public static ObservableCollection thepeoplelist = new ObservableCollection(); 

但是,我正在将我的项目转换为MVVM,当然这不是填充所有项目控件的好方法(主要是listviews)我有多个窗口以这种方式使用此源。

 private void UserControl_Loaded(object sender, RoutedEventArgs e) { lsvallthepeople.ItemSource = somerandomclasss.thepeoplelist; } 

列表视图然后显示具有该信息的所有人。 然而,这不是我打赌的MVVM方式,我没有找到一个没有公共静态ObservableCollection的好方法,但是有一个窗口,你有一个listview,你可以编辑人员,他们在SQL中更新数据库和PersonViewModel(获得INotifyPropertyChanged)。

如果您需要更多信息,请随时询问ofc :)。

您可以使用Static绑定来绑定ItemsSource而不是手动将其设置在代码隐藏中

  

或者公开一个从ViewModel返回集合并绑定到该属性的属性

 public class MyViewModel { public ObservableCollection PersonList { get { return somerandomclasss.thepeoplelist; } } ... }  

我相信你所问的是,“在MVVM中跨多个视图共享项目列表的最佳方式是什么?” 所以我会以这种方式回答这个问题。

假设您有一项提供获取人员列表的方法的服务。 您将其称为“PersonViewModel”,但您可能会将域实体与ViewModel混淆。 在MVVM中,您有一个代表UI控件或屏幕的视图。 然后你有一个ViewModel绑定到视图并将View连接到数据/域模型。 ViewModel可以具有View将绑定到的许多公共属性,包括调用服务以从数据模型填充这些属性的方法。 在你的情况下,我将有一个View + ViewModel,而ViewModel有一个类“Person”的ObservableCollection属性。

以下代码是对其实际外观的解释。 并非一切都已实施。

 public class MyViewModel : INotifyPropertyChanged { public ObservableCollection People { get; set; } public MyViewModel() { this.People = new ObservableCollection(); this.LoadPeople(); } private void LoadPeople() { this.People.Clear(); // Have your logic here that loads the people collection } } 

至于管理单个列表,我建议将人员集合缓存在视图模型可访问的某种静态类或单例中。 然后上面的LoadPeople方法可以从缓存中拉出来。 您甚至可以延迟加载缓存,以便在第一次访问之前不会发出服务请求。

 internal static class SystemContext { private static ObservableCollection _people = null; public static ObservableCollection People { get { if( _people == null ) { _people = new ObservableCollection(); // load the list here from a service or something } return _people; } } } 

所以在你的ViewModel中,LoadPeople会看起来像这样:

 public void LoadPeople() { this.People.Clear(); foreach( Person person in SystemContext.People ) { this.People.Add( person ); } } 

您的UI将看起来像这样:

            

您应该将此作为服务或存储库注入到需要列表的每个视图模型(作为抽象)中。

由于您只想填充此列表一次,您可以在服务/存储库实现的构造函数中执行此操作,或者在服务GetList方法中使用缓存技术。

由于您始终希望将相同的实例传递给每个视图模型,因此您应该使用单例模式,或者如果使用IoC容器,则针对特定实例注册抽象(例如IPeopleRepository )。

由于这将是一个服务/存储库,您应该返回一个不依赖于表示技术的类型,即IEnumerableIList ,并使用它在每个视图模型中创建可观察集合。