C# 在ViewModels之间共享集合
我已经搜索过了,没有任何东西能帮我找到我需要的地方 我的问题描述:C# 在ViewModels之间共享集合,c#,wpf,mvvm,mediator,data-sharing,C#,Wpf,Mvvm,Mediator,Data Sharing,我已经搜索过了,没有任何东西能帮我找到我需要的地方 我的问题描述: 我们有一个单独的对话框窗口,其中包含多个视图(用户控件)。单击“下一步”和“上一步”将在此对话框中前后移动,类似于向导 在6个对话框中,有4个引用了相同的核心数据。例如,我们将说一个可观察的集合 在这种情况下,我有4个viewModels,它们都需要引用相同的ObservableCollection。我不想每次在“向导”对话框中执行新步骤时都保存并重新加载列表 我的问题是实现这一目标的最佳/最实际的方法是什么 我考虑了以下几点:
提前谢谢 一个简单的“依赖注入”应该能起作用。第二个viewmodel的构造函数依赖于注入到其构造函数中的共享数据参数,依此类推。简单的“依赖项注入”应该可以工作。第二个viewmodel的构造函数依赖于注入到其构造函数中的共享数据参数,依此类推。在我看来,您的视图共享相同的模型,这应该是可观察的,并且您的viewmodel都应该以不同的方式表示模型
如果您的模型和ViewModels实现了Observer模式,那么这似乎是最干净、“最正确”的方法。我觉得您的视图共享相同的模型,应该可以观察到,并且您的ViewModels都应该以不同的方式表示模型
如果您的模型和ViewModels实现了Observer模式,那么这似乎是最干净、“最正确”的方法。根据对话框的描述及其工作方式,我将拥有一个控制整个“向导”的
ViewModel
此对话框WizardViewModel
将包含:
可观测采集数据
ObservableCollection对话框向导视图
ViewModelBase SelectedView
ICommand下一个命令
ICommand BackCommand
对话框视图
将包含类似于绑定到所选视图
的内容控件
,而您的下一个
/返回
命令只需将所选视图
切换到对话框向导视图
比如说,
<DockPanel>
<StackPanel DockPanel.Dock="Bottom"
Orientation="Horizontal"
HorizontalAlignment="Center">
<Button Command="{Binding BackCommand}" Content="Back" />
<Button Command="{Binding NextCommand}" Content="Next" />
</StackPanel>
<ContentControl Content="{Binding SelectedView}" />
</DockPanel>
请记住,使用MVVM,您的视图模型
是您的应用程序,而视图
只是为用户提供了一个用户友好的界面,以便与视图模型交互。理想情况下,您应该能够从测试脚本或控制台应用程序之类的东西运行整个应用程序,而根本不需要视图
如果您需要传递某些内容,则应该由应用程序层次结构中的某个父对象处理,或者使用某种通信系统,如Prism的事件聚合器
或MVVM Light的信使
。您不需要使用整个框架来使用这些对象-您只需选择您感兴趣的部分。根据对话框的描述及其工作方式,我将有一个控制整个“向导”的ViewModel
此对话框WizardViewModel
将包含:
可观测采集数据
ObservableCollection对话框向导视图
ViewModelBase SelectedView
ICommand下一个命令
ICommand BackCommand
您的对话框视图
将包含类似于绑定到所选视图
的内容控件
,而您的下一个
/返回
命令只需将所选视图
切换到对话框向导视图
比如说,
<DockPanel>
<StackPanel DockPanel.Dock="Bottom"
Orientation="Horizontal"
HorizontalAlignment="Center">
<Button Command="{Binding BackCommand}" Content="Back" />
<Button Command="{Binding NextCommand}" Content="Next" />
</StackPanel>
<ContentControl Content="{Binding SelectedView}" />
</DockPanel>
请记住,使用MVVM,您的视图模型
是您的应用程序,而视图
只是为用户提供了一个用户友好的界面,以便与视图模型交互。理想情况下,您应该能够从测试脚本或控制台应用程序之类的东西运行整个应用程序,而根本不需要视图
如果您需要传递某些内容,则应该由应用程序层次结构中的某个父对象处理,或者使用某种通信系统,如Prism的事件聚合器
或MVVM Light的信使
。您不需要使用整个框架来使用这些对象-您只需选择您感兴趣的部分。就像Randolf所说的DI可以工作。我使用MEF和Contractor injection以及CreationPolicy shared来实现这一点。你只需要把你想为你处理的东西放在一个导出类中。这有多容易:)
顺便说一句:中介模式是视图模型之间的“通信”,而不是视图之间的“通信”
[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个viewmodels都参考了您的核心数据