我如何从parentViewModel传递参数到我的ViewModel
本文关键字:参数 我的 ViewModel parentViewModel | 更新日期: 2023-09-27 18:06:45
我有一个"open"命令,用户可以在其中选择一个文件。当选择文件时(因此我已经将文件路径作为string
),我从CompositionContainer
中获得DataView
的新实例(具有NonShared
和CreationPolicy
属性)并将其显示在特定区域中。我的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)
{ }
是否有其他方法注入/传递我的字符串参数到视图模型?
我认为你需要使用一个服务来打开文件,而不是通过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;
}