отправить параметр из view-модели в конструктор другой view-модели - PullRequest
1 голос
/ 15 декабря 2010

Я использую caliburn micro и MEF в wpf, и у меня возникла эта проблема.

Я создаю shell-view-model:

public interface IShellViewModel
{
    void ShowLogOnView();
    void ShowMessengerView(PokecAccount account);
}

[Export(typeof(IShellViewModel))]
public class ShellViewModel : Conductor<IScreen>, IShellViewModel
{
    public ShellViewModel()
    {
        ShowLogOnView();
    }

    public void ShowLogOnView()
    {
        ActivateItem(IoC.Get<LogOnViewModel>());
    }

    public void ShowMessengerView(PokecAccount account)
    {
        //send to constructor of MessangerViewModel paramter typeof PokecAccount(own class)
        ActivateItem(IoC.Get<MessengerViewModel>(account));
    }
}

Из view-модели я создаю и показываю в новоммодель представления

[Export]
public class LogOnViewModel : Screen, IDataErrorInfo, ILogOnViewModel
{


    [Import]
    private IShellViewModel _shellViewModel;

    [Import]
    private IPokecConnection _pokecConn;

    private PokecAccount _account;

    public void LogOn(string nick, string password)
    {
        _account = _pokecConn.LogOn(nick, password);
        if (_account != null)
        {
            //create new view-model and show it, problem is send parameter to construtor of MessengerViewModel
            _shellViewModel.ShowMessengerView(_account);
        }
    }
}

Проблема здесь

        //send to constructor of MessangerViewModel paramter typeof PokecAccount(own class)
        ActivateItem(IoC.Get<MessengerViewModel>(account));

Новая модель представления

[Export]
public class MessengerViewModel : Screen, IMessengerViewModel
{
    private PokecAccount _account;

    public MessengerViewModel(PokecAccount account)
    {
        _account = account;
    }
}

Проблема здесь:

    //send to constructor of MessangerViewModel paramter typeof PokecAccount(own class)
    ActivateItem(IoC.Get<MessengerViewModel>(account));

Параметр IoC.Get () может быть только строкой.

Как решить эту проблему?

1 Ответ

2 голосов
/ 15 декабря 2010

Я бы не использовал класс IoC в этом контексте, так как это пример анти-паттерна локатора службы, и он не рекомендуется. Роб упоминает об этом в своей документации Caliburn.Micro. Вы также можете прочитать http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx для хорошего описания анти-паттерна.

Вместо этого я бы использовал абстрактный шаблон фабрики и передавал (абстракцию) фабрику в вашу модель представления оболочки. Это может иметь методы для создания новой модели представления входа в систему и модели представления посыльного. В конкретной реализации этой фабрики вы можете создавать экземпляры этих моделей представлений вручную и просто передавать требуемую информацию.

Я бы также удалил ссылку на модель вида оболочки из модели вида входа в систему. Вместо этого либо используйте стандартные события .NET, на которые оболочка может подписаться, либо посмотрите на агрегатор событий, реализованный в Caliburn.Micro (пример доступен на сайте codeplex), который является реализацией шаблона проектирования посредника. Это обеспечит хорошее разделение между вашими моделями вида.

...