ViewModels с несколькими экземплярами и ViewModelLocator - PullRequest
4 голосов
/ 04 мая 2011

Я создал ViewModelLocator с использованием Unity и успешно использую его с одноэлементными экземплярами ViewModel.Например:

public class ViewModelLocator
{
    private static readonly UnityContainer Container;

    static ViewModelLocator()
    {
        Container = new UnityContainer();

        if (ViewModelBase.IsInDesignModeStatic)
        {
            //Design Time Data Services
            Container.RegisterType<IMyServiceServiceAgent, DesignMyServiceServiceAgent>();
        }
        else
        {
            //Real Data Services
            Container.RegisterType<IMyServiceServiceAgent, MyServiceServiceAgent>();
        }

        Container.RegisterType<TreeViewViewModel>(new ContainerControlledLifetimeManager());
    }

    public TreeViewModel ViewModel
    {
        get
        {
            return Container.Resolve<TreeViewModel>();
        }
    }
}

ViewModelLocator определен как ресурс в App.xaml:

<Application.Resources>
    <ResourceDictionary>
        <VMS:ViewModelLocator x:Key="ViewModelLocator" d:IsDataSource="True"/>
    </ResourceDictionary>
</Application.Resources>

, что позволяет мне привязываться к ViewModel в любом из представлений следующим образом:

DataContext="{Binding TreeViewModel, Source={StaticResource ViewModelLocator}}" d:DataContext="{d:DesignInstance IsDesignTimeCreatable=False}"

Мой вопрос: как мне поддерживать один и тот же шаблон (и смешиваемость) с несколькими экземплярами одной и той же модели представления?

Я нашел ссылку на то, что я хочу сделать в этомpost Как иметь несколько пар "View-ViewModel"? , но это не входит в специфику реализации.

Я хочу иметь возможность иметь несколько экземпляров этих ViewsПары / ViewModel для разных деревьев данных, позволяющие копировать и вставлять между ними и т. Д., Но не могут придумать, как обрабатывать определенные экземпляры в ViewModelLocator с использованием контейнера?

Я предполагаю, что мне нужна какая-то коллекция ViewModel согласноупомянутое выше сообщение, но как мне зарегистрировать эту коллекцию в контейнере Unity и как привязать ее к представлению в представлении?

Любая помощьочень ценится.

1 Ответ

0 голосов
/ 11 мая 2011

В вашей ситуации я по-прежнему имел одну ViewModel для представления, но имел другую ViewModel, в которой хранятся данные, которые могут изменяться.

Например, если у меня есть элемент управления UserView, отображающий пользователяинформация, у меня есть один UserViewModel, связанный с этим представлением через ViewModelLocator.У меня также есть класс UserModel, который может меняться в зависимости от текущего пользователя, который просматривается / редактируется.Этот класс UserModel наследуется от ViewModelBase и предоставляется классом UserViewModel через свойство.В другом месте приложения, если, например, выбран пользователь, я установил для свойства UserViewModel User значение UserModel, которое я хочу отображать в UserView.

...