C# 两个视图-一个视图模型

C# 两个视图-一个视图模型,c#,wpf,viewmodel,C#,Wpf,Viewmodel,我一定误解了视图模型和视图的概念。但目前我无法从基础上重建应用程序,这次做得更好。我的情况是,我有一个视图,用户可以在其中加载文件并读取它们,绘图仪显示图形并执行一些操作。我希望能够生成数据的报告(如摘要),但我希望它位于其他视图中。我正在使用,另一个视图在另一个选项卡中 我想要的是两个选项卡同步,当我在“绘图仪选项卡”中加载文件时,文件也必须加载到另一个视图中。为此,我认为我需要的是将视图绑定到相同的ViewModel,例如,在这里我有LoadedFiles=List,因此我将能够实现它。问题

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

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

MainViewModel vm = new MainViewModel();
DataContext = vm;
或者在XAML中

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


我实际上绑定到不同的MainViewModels,数据不再共享。我是否需要MVVM库中的一些类,比如Locator等等?如何做到这一点?为了使每个视图都有单独的视图模型,但数据相同(或不同),我将来可以做些什么?

将虚拟机存储在父虚拟机的属性中,然后使用不同的
ContentTemplates
(包含各自的视图)将属性绑定到两个
contentpresenter

将虚拟机存储在父虚拟机的属性中,然后使用不同的
ContentTemplates
(包含各自的视图)将属性绑定到两个
contentpresenter

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

祝你好运


M.Moshe

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

祝你好运


M.Moshe

您可以创建一个具有LoadedFiles属性的新类,然后每个唯一的视图模型都可以引用该类。可以在多个视图模型之间共享具有这些共享属性的一个类。我将把这个类注入到我的每个视图模型中(基本上使用控制反转和依赖注入)

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

一些示例代码-

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
    }
}
公共MyClass
{
公共列表加载的文件{get;set;}
}
公共视图模型一
{
公共MyClass MyClassInstance{get;set;}
公共视图模型一(MyClass MyClass)
{
MyClassInstance=myclass
}
}
公共视图模型二
{
公共MyClass MyClassInstance{get;set;}
公共视图模型二(MyClass MyClass)
{
MyClassInstance=myclass
}
}
您还可以使用将每个视图的DataContext设置为适当的视图

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

您可以创建一个具有LoadedFiles属性的新类,然后每个唯一的视图模型都可以引用该类。可以在多个视图模型之间共享具有这些共享属性的一个类。我将把这个类注入到我的每个视图模型中(基本上使用控制反转和依赖注入)

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

一些示例代码-

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
    }
}
公共MyClass
{
公共列表加载的文件{get;set;}
}
公共视图模型一
{
公共MyClass MyClassInstance{get;set;}
公共视图模型一(MyClass MyClass)
{
MyClassInstance=myclass
}
}
公共视图模型二
{
公共MyClass MyClassInstance{get;set;}
公共视图模型二(MyClass MyClass)
{
MyClassInstance=myclass
}
}
您还可以使用将每个视图的DataContext设置为适当的视图

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