1

我一定误解了ViewModels和视图的概念。但此时我无法从地面重建应用程序,而这次做得更好。我的情况是我有一个视图,用户可以在其中加载文件并阅读它们,绘图仪显示图形并实现了一些操作。我希望能够生成数据的报告(如摘要),但我希望它在其他视图中。我正在使用ModernUI,这个另一个视图在另一个选项卡中。

我想要的是两个选项卡同步,当我在“绘图仪选项卡”中加载文件时,该文件也必须在另一个视图中加载。为此,我认为我需要将视图绑定到相同的视图ViewModel,例如LoadedFiles = List<File>,我将能够实现它。问题是,如果我绑定它

MainViewModel vm = new MainViewModel();
DataContext = vm;

或在 XAML 中

<UserControl.Resources>
<UserControl.DataContext=local:MainViewModel/>
</UserControl.Resources>

我实际上绑定到不同的 MainViewModels 并且不再共享数据。我是否需要 MVVM 库中的一些类,例如 Locator 等?如何做到这一点?将来我该怎么做才能为每个 View 拥有单独的 ViewModel 但相同(或不同)的数据?

4

3 回答 3

1

您可以创建一个具有 LoadedFiles 属性的新类,然后每个唯一的视图模型都可以引用此类。您可以在多个视图模型之间共享具有这些共享属性的一个类。我正在使用 MVVMLight 的定位器和 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将每个 View 的 DataContext 设置为适当的 View。

<UserControl x:Class="View1"             
             DataContext="{Binding ViewModel1, Source={StaticResource Locator}}"...>
于 2013-07-09T22:26:25.447 回答
0

将 VM 存储在父 VM 的属性中,然后ContentPresenters使用不同ContentTemplates的(包含各自的视图)将该属性绑定到两个。

于 2013-07-09T20:46:28.830 回答
0

您应该问自己两个视图是否应该共享相同的视图模型?它们在视图模型中共享相同的属性还是具有不同的属性?如果他们应该共享相同的视图模型,您应该使用定位器从定位器创建视图模型并将定位器传递给视图。否则,您应该有两个视图模型。为了保持视图模型之间的最小化,您应该使用两个视图模型都知道的服务(通过接口更好)。一个视图模型通知服务已执行的操作,第二个视图模型已处理该操作(通过注册到事件)

祝你好运,

M·摩西

于 2013-07-09T21:29:17.690 回答