我一定误解了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,但是相同(或不同)的数据?
答案 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已处理该操作(通过注册到事件)
祝你好运,
微米。摩西