Обычный способ отобразить диалог открытия файла в WPF и MVVM - это использовать сервис, который представляет диалог открытия файла.Вы должны внедрить этот сервис в вашу ViewModel, используя обычный метод IoC в Prism.
Этот интерфейс INTERFACE не должен зависеть от какого-либо конкретного метода пользовательского интерфейса (обычно его очень легко реализовать в тесте командной строки или модулеtest mock).
РЕАЛИЗАЦИЯ службы должна быть в проекте, который зависит от WPF, и эта реализация должна затем вызывать OpenFileDialog для открытия файла.
Ваша команда кнопки должна вызывать экземплярслужбы, переданной в ViewModel, и откройте диалоговое окно.
Есть много реализаций этой идеи, вот простая:
public interface IOpenFileService
{
/// <summary>
/// Open file
/// </summary>
/// <returns>True if file selected</returns>
bool? OpenFile();
/// <summary>
/// Full names of the selected files
/// </summary>
string[] FileNames { get; }
}
public class OpenFileService: IOpenFileService
{
OpenFileDialog _openFileDialog = new OpenFileDialog();
string[] _selectedFileNames;
public bool? OpenFile()
{
_openFileDialog.Multiselect = true;
var ofd = _openFileDialog.ShowDialog();
if (ofd.HasValue && ofd.Value)
{
_selectedFileNames = _openFileDialog.FileNames;
}
return ofd;
}
public string[] FileNames
{
get { return _selectedFileNames ; }
}
}
Итак, вы регистрируете реализацию службы,и ваша ViewModel получает реализацию в конструкторе:
public class SomeViewModel
{
public SomeViewModel(IFileOpenService fileOpen)
{
this._fileOpen = fileOpen;
}
public void FileOpenCommandExecute
{
if (this._fileOpen.OpenFile())
{
var selectedFiles = this._fileOpen.FileNames;
// .. do something with the selected files...
}
}
}
Существуют другие реализации, которые поддерживают многие другие типы диалогов, так что вы должны искать их тоже, но это основная идея.
HTH, Том