两个视图-一个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,但数据相同(或不同),我将来可以做些什么?

两个视图-一个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