我有一个“打开”命令,用户可以在其中选择一个文件。选择文件后(因此我将文件路径设为string
)我得到了DataView
的新实例(包含NonShared
和CreationPolicy
属性) 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?
答案 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;
}