Как передать параметры из parentViewModel в мою ViewModel? - PullRequest
4 голосов
/ 28 августа 2011

У меня есть команда «открыть», где пользователь может выбрать файл. Когда файл выбран (и поэтому я получил путь к файлу как string), я получаю новый экземпляр моего DataView (с атрибутами NonShared и CreationPolicy) из CompositionContainer и отображаю его в конкретном регионе. Мой DataView получает свой DataViewModel через DI. Теперь моя проблема в том, как передать выбранный путь к файлу в NEW (созданный после выбора файла) ViewModel?

Мой первый подход казался умным и работал до тех пор, пока я создал только один 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)
{ }

Есть ли другой способ вставить / передать мой строковый параметр в модель представления?

Ответы [ 2 ]

1 голос
/ 29 августа 2011

Я всегда обрабатывал подобные вещи в ViewModel

My 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;
}
1 голос
/ 28 августа 2011

Я думаю, вам нужно использовать сервис для открытия файлов, а не экспортировать значения через MEF.

Если у вас есть общий сервис, который используют все ваши ViewModel, они могут просто импортировать ваш сервис и вызвать метод OpenFile ().

У меня есть MVVM-проект с открытым исходным кодом , в котором есть быстрый пример этого. Смотрите пример шаблона здесь .

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

...