2013-07-09 82 views
0

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

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

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

或XAML

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

我实际上绑定到不同的MainViewModels和数据不再被共享。我是否需要一些来自MVVM库(例如Locator等)的类?如何做到这一点?我可以在将来做什么,以便为每个视图分别使用不同的ViewModels,但数据是相同的(或不同的)?

回答

1

您可以创建一个新的有你的LoadedFiles属性的类,然后每个唯一的视图模型可以引用这个类。您可以与多个视图模型之间的这些共享属性共享一个类。我using MVVMLight's Locator with an Autofac container注入这个类到我的每个视图模型(基本上使用控制和依赖注入反转)。

您可以阅读控制反转和依赖注入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每个视图的DataContext的设置为相应的视图。

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

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

0

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

好运,

M.卡察夫