两个视图-一个ViewModel
本文关键字:一个 ViewModel 视图 两个 | 更新日期: 2023-09-27 18:21:39
我一定误解了ViewModels
和Views的概念。但现在我无法从头开始重建应用程序,而这次做得更好。我的情况是,我有一个视图,用户可以在其中加载文件并读取它们,绘图仪显示图形,并执行一些操作。我希望能够生成数据的报告(如摘要),但我希望它在其他视图中。我正在使用ModernUI,这个其他视图在另一个选项卡中
我想要的是使两个选项卡同步,当我在"绘图仪选项卡"中加载文件时,该文件也必须在另一个视图中加载。为此,我认为我需要的是将视图绑定到相同的ViewModel
,例如LoadedFiles = List<File>
,这样我就可以实现它。问题是,如果我将其绑定到
MainViewModel vm = new MainViewModel();
DataContext = vm;
或XAML
<UserControl.Resources>
<UserControl.DataContext=local:MainViewModel/>
</UserControl.Resources>
我实际上绑定到了不同的MainViewModel,数据不再共享。我需要MVVM库中的一些类吗,比如Locator等等?这是怎么做到的?为了使每个视图都有单独的ViewModel,但数据相同(或不同),我将来可以做些什么?
您可以创建一个具有LoadedFiles属性的新类,然后每个唯一的视图模型都可以引用该类。可以在多个视图模型之间共享具有这些共享属性的一个类。我使用MVVMLight的Locator和Autofac容器将这个类注入到我的每个视图模型中(基本上使用控制反转和依赖注入)。
您可以在这里阅读控制反转和依赖注入。
一些示例代码-
public MyClass
{
public List<File> LoadedFiles{get; set;}
}
public ViewModelOne
{
public MyClass MyClassInstance {get; set;}
public ViewModelOne(MyClass myclass)
{
MyClassInstance = myclass
}
}
public ViewModelTwo
{
public MyClass MyClassInstance {get; set;}
public ViewModelTwo(MyClass myclass)
{
MyClassInstance = myclass
}
}
您还可以使用MVVMLight的Locator将每个视图的DataContext设置为适当的视图。
<UserControl x:Class="View1"
DataContext="{Binding ViewModel1, Source={StaticResource Locator}}"...>
将VM存储在父VM的属性中,然后使用不同的ContentTemplates
(包含各自的视图)将属性绑定到两个ContentPresenters
。
您应该问问自己,两个视图是否应该共享同一个视图模型?它们在视图模型中共享相同的属性还是具有不同的属性?如果它们共享相同的视图模型,则应使用定位器从定位器创建视图模型,并将定位器传递给视图。否则,您应该有两个视图模型。为了尽量减少视图模型之间的冲突,您应该使用两个视图模型都知道的服务(最好通过接口)。一个视图模型通知服务已执行的操作,第二个视图模型已处理该操作(通过注册到事件)
祝你好运,
M。Moshe