Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ViewModels之间共享集合_C#_Wpf_Mvvm_Mediator_Data Sharing - Fatal编程技术网

C# 在ViewModels之间共享集合

C# 在ViewModels之间共享集合,c#,wpf,mvvm,mediator,data-sharing,C#,Wpf,Mvvm,Mediator,Data Sharing,我已经搜索过了,没有任何东西能帮我找到我需要的地方 我的问题描述: 我们有一个单独的对话框窗口,其中包含多个视图(用户控件)。单击“下一步”和“上一步”将在此对话框中前后移动,类似于向导 在6个对话框中,有4个引用了相同的核心数据。例如,我们将说一个可观察的集合 在这种情况下,我有4个viewModels,它们都需要引用相同的ObservableCollection。我不想每次在“向导”对话框中执行新步骤时都保存并重新加载列表 我的问题是实现这一目标的最佳/最实际的方法是什么 我考虑了以下几点:

我已经搜索过了,没有任何东西能帮我找到我需要的地方

我的问题描述:

  • 我们有一个单独的对话框窗口,其中包含多个视图(用户控件)。单击“下一步”和“上一步”将在此对话框中前后移动,类似于向导

  • 在6个对话框中,有4个引用了相同的核心数据。例如,我们将说一个可观察的集合

  • 在这种情况下,我有4个viewModels,它们都需要引用相同的ObservableCollection。我不想每次在“向导”对话框中执行新步骤时都保存并重新加载列表

  • 我的问题是实现这一目标的最佳/最实际的方法是什么

    我考虑了以下几点:

  • 静态类
  • 单身汉
  • 在视图之间传递参数(尽管这很困难,因为nextlocation和previouslocation非常通用)
  • 中介模式?中介模式的问题是我不想在视图之间“交流”。我只希望所有视图共享相同的数据源
  • 观察者模式?如果我正在使用ObservableCollections并实现INotifyPropertyChanged,那么我应该不需要通知任何人任何更改,对吗
  • 请让我知道更多的信息,你可能需要帮助我这一点,我会很高兴地提供它

    我在设计时并不是在寻找代码示例。虽然代码示例可以帮助解释设计,但我完全赞成

    最后,EventAggregator不是一个选项,因为我没有使用任何框架(除非我没有正确理解EventAggregator)


    提前谢谢

    一个简单的“依赖注入”应该能起作用。第二个viewmodel的构造函数依赖于注入到其构造函数中的共享数据参数,依此类推。

    简单的“依赖项注入”应该可以工作。第二个viewmodel的构造函数依赖于注入到其构造函数中的共享数据参数,依此类推。

    在我看来,您的视图共享相同的模型,这应该是可观察的,并且您的viewmodel都应该以不同的方式表示模型


    如果您的模型和ViewModels实现了Observer模式,那么这似乎是最干净、“最正确”的方法。

    我觉得您的视图共享相同的模型,应该可以观察到,并且您的ViewModels都应该以不同的方式表示模型


    如果您的模型和ViewModels实现了Observer模式,那么这似乎是最干净、“最正确”的方法。

    根据对话框的描述及其工作方式,我将拥有一个控制整个“向导”的
    ViewModel

    对话框WizardViewModel
    将包含:

    • 可观测采集数据
    • ObservableCollection对话框向导视图
    • ViewModelBase SelectedView
    • ICommand下一个命令
    • ICommand BackCommand
    您的
    对话框视图
    将包含类似于绑定到
    所选视图
    内容控件
    ,而您的
    下一个
    /
    返回
    命令只需将
    所选视图
    切换到
    对话框向导视图

    比如说,

    <DockPanel>
        <StackPanel DockPanel.Dock="Bottom" 
                    Orientation="Horizontal" 
                    HorizontalAlignment="Center">
            <Button Command="{Binding BackCommand}" Content="Back" />
            <Button Command="{Binding NextCommand}" Content="Next" />
        </StackPanel>
    
        <ContentControl Content="{Binding SelectedView}" />
    </DockPanel>
    
    请记住,使用MVVM,您的
    视图模型
    是您的应用程序,而
    视图
    只是为用户提供了一个用户友好的界面,以便与视图模型交互。理想情况下,您应该能够从测试脚本或控制台应用程序之类的东西运行整个应用程序,而根本不需要
    视图


    如果您需要传递某些内容,则应该由应用程序层次结构中的某个父对象处理,或者使用某种通信系统,如Prism的
    事件聚合器
    或MVVM Light的
    信使
    。您不需要使用整个框架来使用这些对象-您只需选择您感兴趣的部分。

    根据对话框的描述及其工作方式,我将有一个控制整个“向导”的
    ViewModel

    对话框WizardViewModel
    将包含:

    • 可观测采集数据
    • ObservableCollection对话框向导视图
    • ViewModelBase SelectedView
    • ICommand下一个命令
    • ICommand BackCommand
    您的
    对话框视图
    将包含类似于绑定到
    所选视图
    内容控件
    ,而您的
    下一个
    /
    返回
    命令只需将
    所选视图
    切换到
    对话框向导视图

    比如说,

    <DockPanel>
        <StackPanel DockPanel.Dock="Bottom" 
                    Orientation="Horizontal" 
                    HorizontalAlignment="Center">
            <Button Command="{Binding BackCommand}" Content="Back" />
            <Button Command="{Binding NextCommand}" Content="Next" />
        </StackPanel>
    
        <ContentControl Content="{Binding SelectedView}" />
    </DockPanel>
    
    请记住,使用MVVM,您的
    视图模型
    是您的应用程序,而
    视图
    只是为用户提供了一个用户友好的界面,以便与视图模型交互。理想情况下,您应该能够从测试脚本或控制台应用程序之类的东西运行整个应用程序,而根本不需要
    视图


    如果您需要传递某些内容,则应该由应用程序层次结构中的某个父对象处理,或者使用某种通信系统,如Prism的
    事件聚合器
    或MVVM Light的
    信使
    。您不需要使用整个框架来使用这些对象-您只需选择您感兴趣的部分。

    就像Randolf所说的DI可以工作。我使用MEF和Contractor injection以及CreationPolicy shared来实现这一点。你只需要把你想为你处理的东西放在一个导出类中。这有多容易:)

    顺便说一句:中介模式是视图模型之间的“通信”,而不是视图之间的“通信”

    [Export]
    public class MyClassWichHasDataSharedFor4Views {}
    
    public class Viewmodel1
    {
       [ImportingContructor] 
       public Viewmodel1(MyClassWichHasDataSharedFor4Views shareddata)
       {}
    }
    
    public class Viewmodel2
    {
       [ImportingContructor] 
       public Viewmodel2(MyClassWichHasDataSharedFor4Views shareddata)
       {}
    }
    
    public class Viewmodel3
    {
       [ImportingContructor] 
       public Viewmodel3(MyClassWichHasDataSharedFor4Views shareddata)
       {}
    }
    
    public class Viewmodel4
    {
       [ImportingContructor] 
       public Viewmodel4(MyClassWichHasDataSharedFor4Views shareddata)
       {}
    }
    
    现在,4个viewmodels都参考了您的核心数据