Skip to main content
 首页 » 编程设计

c#之在 ViewModel 之间共享集合

2024年01月13日32dyllove98

我已经搜索过,但没有任何东西可以帮助我到达我需要到达的地方。

我的问题描述:

  1. 我们有一个对话窗口,其中包含多个 View (用户控件)。单击“下一步”和“返回”将使您在此对话框中前进和后退,类似于向导。

  2. 在 6 个对话框中,有 4 个引用相同的核心数据。例如我们会说一个 ObservableCollection

  3. 既然如此,我有 4 个 viewModel,它们都需要引用同一个 ObservableCollection。我不想在每次进入“向导”对话框中的新步骤时保存并重新加载列表。

我的问题是什么是最好/最实用的方法来完成这个。

我考虑过以下事项:

  1. 静态类
  2. 单例 - 嗯嗯
  3. 在 View 之间传递参数(尽管这很困难,因为 nextlocation 和 previouslocation 非常通用)。
  4. 中介者模式?我对调解器模式的问题是我不想在 View 之间“交流”。我只希望所有 View 共享相同的数据源。
  5. 观察者模式?如果我正在使用 ObservableCollections 并实现 INotifyPropertyChanged,那么我不需要通知任何人更改吗?

请告诉我您可能需要帮助我的其他信息,我很乐意提供。

我在设计时并不是真的在寻找代码示例。尽管如果代码示例可以帮助解释设计,我完全赞成。

最后,EventAggregator 不是一个选项,因为我没有使用任何框架(除非我没有正确理解 EventAggregator)。

提前致谢!

请您参考如下方法:

就像 Randolf 所说的 DI 会起作用。我通过共享 CreationPolicy 的 MEF 和构造函数注入(inject)来执行此操作。你只需要把你想为你处理的东西 4views 放在一个导出类中。这有多容易:)

顺便说一句:调解器模式是在 View 模型而非 View 之间“通信”。

[Export] 
public class MyClassWichHasDataSharedFor4Views {} 
 
public class Viewmodel1 
{ 
   [ImportingContructor]  
   public Viewmodel1(MyClassWichHasDataSharedFor4Views shareddata) 
   {} 
} 
 
public class Viewmodel2 
{ 
   [ImportingContructor]  
   public Viewmodel2(MyClassWichHasDataSharedFor4Views shareddata) 
   {} 
} 
 
public class Viewmodel3 
{ 
   [ImportingContructor]  
   public Viewmodel3(MyClassWichHasDataSharedFor4Views shareddata) 
   {} 
} 
 
public class Viewmodel4 
{ 
   [ImportingContructor]  
   public Viewmodel4(MyClassWichHasDataSharedFor4Views shareddata) 
   {} 
} 

现在 4 个 View 模型引用了您的核心数据