C# 如何将参数从parentViewModel传递到我的ViewModel?

C# 如何将参数从parentViewModel传递到我的ViewModel?,c#,.net,mvvm,prism,mef,C#,.net,Mvvm,Prism,Mef,我有一个“打开”命令,用户可以在其中选择一个文件。当选择文件时(因此我将文件路径作为字符串),我将从合成容器中获取我的数据视图的新实例(具有非共享和创建策略属性),并将其显示在特定区域中。MyDataView通过DI获取其DataViewModel。现在,我的问题是如何将所选文件路径传递给新的(在选择文件后创建)视图模型 只要我只创建了一个视图,我的第一种方法就似乎很聪明,而且有效。但是,由于我创建了多个视图(选项卡),以下方法不起作用,因为我不能多次合成相同的值 if (fileDialog.

我有一个“打开”命令,用户可以在其中选择一个文件。当选择文件时(因此我将文件路径作为
字符串
),我将从
合成容器
中获取我的
数据视图
的新实例(具有
非共享
创建策略
属性),并将其显示在特定区域中。My
DataView
通过DI获取其
DataViewModel
。现在,我的问题是如何将所选文件路径传递给新的(在选择文件后创建)视图模型

只要我只创建了一个
视图
,我的第一种方法就似乎很聪明,而且有效。但是,由于我创建了多个视图(选项卡),以下方法不起作用,因为我不能多次合成相同的值

if (fileDialog.ShowDialog() == true)
{               
    Container.ComposeExportedValue("FilePath", fileDialog.FileName);
    IRegion contentRegion = regionManager.Regions[Regions.CONTENT];
    contentRegion.Add(Container.GetExportedValue<IDataView>(), null, true);
} 

[ImportingConstructor]
public DataViewModel(IRegionManager regionManager, 
    [Import("FilePath")] string filePath)
{ }
if(fileDialog.ShowDialog()==true)
{               
ComposeExportedValue(“FilePath”,fileDialog.FileName);
IRegion contentRegion=regionManager.Regions[Regions.CONTENT];
Add(Container.GetExportedValue(),null,true);
} 
[导入构造函数]
公共数据视图模型(IRegionManager regionManager,
[导入(“文件路径”)]字符串文件路径)
{ }

是否有其他方法将my string参数注入/传递到viewmodel?

我认为您需要使用服务打开文件,而不是通过MEF导出值

如果您有一个所有ViewModels都使用的公共服务,那么它们可以简单地导入您的服务并调用OpenFile()方法

我有一个,有一个这样做的例子。请参见模板示例


同时检查顶部的答案,他们有另一个实现。

我总是在
视图模型中处理这种事情

我的
ParentViewModel
将包含
OpenFileViewModel
的一个实例,当执行
ParentViewModel.SelectFileCommand
时,它调用类似于
OpenFileViewModel.SelectFile()的内容

要获取所选文件,我通常订阅
OpenFileViewModel.PropertyChanged
并侦听
FileName
属性上的更改事件,或者有时我会使用可覆盖的
ProcessFile
方法,我可以将事件连接到该方法,当选择文件时将触发该方法

OpenFileViewModel.SelectFile
方法通常如下所示

private void SelectFile()
{
    var dlg = new OpenFileDialog();
    dlg.DefaultExt = this.Extension;
    dlg.Filter = this.Filter;

    if (dlg.ShowDialog() == true)
    {
        var file = new FileInfo(dlg.FileName);
        FileName = file.FullName;

        if (ProcessFileDelegate != null)
            ProcessFileDelegate()
    }
}
我的
ParentViewModel
通常包含如下代码:

public ParentViewModel()
{
    this.OpenFileDialog = new OpenFileViewModel();
    this.OpenFileDialog.PropertyChanged += OpenFileDialog_PropertyChanged;
    this.OpenFileDialog.ProcessFileDelegate = ProcessFile;
}

这也是我想的,但后来我遇到了一个问题,即当用户选择文件时,视图和视图模型不存在。它们是在用户成功选择文件时创建的。解决方案是在用户单击“打开”时创建视图及其ViewModel,如果用户取消文件对话框,则销毁视图和ViewModel,但这听起来很尴尬。如果您确实在关注MVVM,则应用程序中的每个屏幕(或部分)都将有一个适当的视图和ViewModel。如果在选择文件后打开文件时显示一个新窗口,则此工作将在“父”视图模型中完成,并且在选择文件之前,您无需创建(或使用MEF导入)此“子”视图模型。此工作实际上在“父”视图模型中完成,但必须显示的数据(与所选文件相关)必须在新视图中显示,无论哪种方式,我都需要将a)文件信息或b)由于所选文件而生成的数据传递到新视图,否则视图不知道显示什么(为了更好地理解,可以看看f.e.Notepadd++中打开文件的过程是如何完成的。按open,选择一个文件,然后按ok,然后显示一个包含文件数据的新选项卡(该选项卡是我要创建的视图)。您的新选项卡只需要公开父ViewModel将使用文件名设置的字符串属性。通过Views Datacontext注入依赖项(这是我必须做的,因为我的视图创建了ViewModel->View.Datacontext.MyStringProperty=myString;)听起来很尴尬。当我找到“clean”时解决方案,我将用该解决方案编辑我的问题。但无论如何,谢谢