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

时间:2011-08-27 22:01:44

标签: c# .net mvvm prism mef

我有一个“打开”命令,用户可以在其中选择一个文件。选择文件后(因此我将文件路径设为string)我得到了DataView的新实例(包含NonSharedCreationPolicy属性) CompositionContainer的{​​{1}}并将其显示在特定区域。我的DataView通过DI获取DataViewModel。现在我的问题是如何将选定的文件路径传递给 NEW (在选择文件后创建)ViewModel?

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

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)
{ }

有没有其他方法可以将我的字符串参数注入/传递给viewmodel?

2 个答案:

答案 0 :(得分:1)

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

如果您拥有所有ViewModel使用的公共服务,他们只需导入您的服务并调用OpenFile()方法。

我有一个MVVM open source project,它有一个快速的例子。请参阅模板示例here

同时查看热门答案here,他们还有其他实施方案。

答案 1 :(得分:1)

我总是在ViewModel

内处理这类事情

我的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;
}