如何替换静态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
)。
由于这将是一个服务/存储库,您应该返回一个不依赖于表示技术的类型,即IEnumerable
或IList
,并使用它在每个视图模型中创建可观察集合。