两个视图 - 一个ViewModel

时间:2013-07-09 20:41:03

标签: c# wpf viewmodel

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

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

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

或在XAML中

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

我实际上绑定到不同的MainViewModel,数据不再共享。我是否需要MVVM库中的一些类,例如Locator等等?怎么做到这一点?我将来可以做些什么,以便为每个View提供单独的ViewModel,但是相同(或不同)的数据?

3 个答案:

答案 0 :(得分:1)

您可以创建一个具有LoadedFiles属性的新类,然后每个唯一的视图模型都可以引用此类。您可以在多个视图模型之间共享具有这些共享属性的一个类。我using MVVMLight's Locator with an Autofac container将这个类注入我的每个视图模型中(基本上使用Inversion of Control和Dependency Injection)。

您可以阅读控制和依赖注入反转here

一些示例代码 -

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's Locator将每个View的DataContext设置为适当的视图。

<UserControl x:Class="View1"             
             DataContext="{Binding ViewModel1, Source={StaticResource Locator}}"...>

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

祝你好运,

微米。摩西