Открытие CommonOpenFileDialog с использованием WPF PRISM MVVM - PullRequest
0 голосов
/ 02 мая 2019

Я читал о том, как лучше всего открывать диалоги с помощью PRISM и открывать их способом MVVM, однако то, что я нашел до сих пор, похоже, работает только с пользовательскими диалогами. Я хотел бы иметь возможность открывать CommonOpenFileDialog при нажатии кнопки, но я очень озадачен тем, как я могу это сделать, придерживаясь шаблона MVVM.

Я могу сделать это с помощью кода, но я хотел бы избежать этого, если это возможно, но проблема, с которой я здесь сталкиваюсь, заключается в том, как я могу затем передать результат диалога в модель представления из кода позади. Будет ли здесь приемлем EventAggregator?

Это мой класс SelectFolderDialog, который открывает диалоговое окно. В настоящее время это вызывается из кода моего представления:

public class SelectFolderDialog
{

    public string SelectFolder()
    {

        var folderSelectorDialog = new CommonOpenFileDialog();
        folderSelectorDialog.EnsureReadOnly = true;
        folderSelectorDialog.IsFolderPicker = true;
        folderSelectorDialog.AllowNonFileSystemItems = false;
        folderSelectorDialog.Multiselect = false;
        folderSelectorDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        folderSelectorDialog.Title = "Select Folder";
        folderSelectorDialog.ShowDialog();

        string SelectedFolderPath = folderSelectorDialog.FileName;
        Console.WriteLine(SelectedFolderPath);

        return SelectedFolderPath;


    }
}

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

Несколько лет назад я написал довольно подробную статью , показывающую, как делать чистые диалоги MVVM с привязкой данных, вы можете попробовать пример проекта.В дополнение к общим системным диалогам он также отлично работает с сторонними диалоговыми библиотеками.

Возможно, я скоро обновлю его, так как недавно я реализовал пользовательские диалоговые окна WPF (произвольные формы и т. Д.), Которые похожи, ноиметь несколько причуд, которые вы должны помнить.

0 голосов
/ 02 мая 2019

Самый простой способ MVV - это иметь SystemDialogService, который вы внедряете в свои виртуальные машины, который имеет метод GetOpenFileDialogPath или что-то еще, что делает именно то, что делает ваш код.

Таким образом, вы легко можете его высмеятьв ваших модульных тестах и ​​используйте его в других виртуальных машинах.

Кроме того, наличие кода позади НЕ ПЛОХО!

Итак, вы переименовываете свой класс, добавляя Service в конце извлеките интерфейс для него и внедрите его в конструктор виртуальной машины, используя любую используемую вами форму внедрения зависимостей.

Затем в вашей команде нажатия кнопки вы можете выполнить:

var path = _systemDialogService.SelectFolder()- это все

...