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

本文关键字:参数 我的 ViewModel parentViewModel | 更新日期: 2023-09-27 18:06:45

我有一个"open"命令,用户可以在其中选择一个文件。当选择文件时(因此我已经将文件路径作为string),我从CompositionContainer中获得DataView的新实例(具有NonSharedCreationPolicy属性)并将其显示在特定区域中。我的DataView通过DI获得DataViewModel。现在我的问题是如何将所选的文件路径传递给NEW(选择文件后创建)视图模型?

我的第一种方法似乎很聪明,只要我只创建一个View就可以工作。但是,由于我创建了多个视图(制表符),下面的方法不工作,因为我不能组成相同的值不止一次。

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

是否有其他方法注入/传递我的字符串参数到视图模型?

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

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

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

我有一个MVVM开源项目,它有一个快速的例子。查看这里的模板示例。

也看看上面的答案,他们有另一个实现。

我总是在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;
}