Передача одного экземпляра модели в модели с несколькими представлениями в одном модуле для разных видов - PullRequest
1 голос
/ 18 августа 2011

Я работаю над проектом, использующим PRISM, в котором я оставил навигацию, реализованную в виде дерева, и любое событие клика происходит, вызывая событие с помощью агрегирования событий в модуле регистрации, который имеет модель нескольких представлений для нескольких представлений (например, Wizard Applicaiton, где вы можете перейти много просмотров для сбора данных). Я хочу иметь общую или совместно используемую или одноэлементную модель, которую можно передавать по моделям этого вида и сохранять в конце .... пользователи могут щелкнуть любую ссылку в любой навигации в любое время, и она должна сохранять данные в этой одноэлементной модели. через другую точку зрения модели. У вас есть образцы, которые делают что-то подобное ... или вы можете быстро напечатать, как это сделать? ИЛИ это невозможно сделать вообще. Я следую всем моделям из видео «Многообразие» Брайана Лагунаса для PRISM, поэтому попробуйте использовать этот способ ....

Ответы [ 3 ]

3 голосов
/ 18 августа 2011

У меня будет MasterViewModel, который управляет страницами "мастера" и текущим состоянием

Он будет содержать следующие свойства:

  • List<ViewModelBase> Pages
  • int CurrentPageIndex
  • ViewModelBase CurrentPage, что возвращает Pages[CurrentPageIndex]
  • MyClass DataObject

MasterView, который идет с MasterViewModel, будет не более чем ContentControl с его Content, связанным с CurrentPage. Я бы, вероятно, также определил DataTemplates в MasterView, который сообщает WPF, какой View рисовать, с каким Page

Ваш MasterViewModel будет отвечать за обработку страниц и передачу каждой странице ссылки на необходимые данные. Например, в конструкторе это может сказать,

public MasterViewModel(MyClass dataObject)
{
    DataObject = dataObject;

    Pages.Add(new InfoPage(DataObject));
    Pages.Add(new AddressPage(DataObject.Addresses));
    Pages.Add(new PhonePage(DataObject.Phones));
    Pages.Add(new SaveMyClassPage(DataObject));

    CurrentPageIndex = 0;
}

У меня есть пример здесь , если вам интересно

0 голосов
/ 18 августа 2011

Когда вы используете Prism, у вас также есть контейнер для инъекций зависимостей, обычно Unity или MEF. Чтобы решить вашу проблему, вы можете зарегистрировать вашу модель как одиночную для этих DI-контейнеров. Каждая модель представления, которая запрашивает у контейнера DI разрешение своей зависимости, в нашем особом случае модель будет возвращать экземпляр singleton из контейнера DI.

Пример Unity: вы регистрируете свою модель как одноэлементный экземпляр:

public void Initialize( )
{
    container.RegisterInstance<Model>(new Model(), new ContainerControlledLifetimeManager( ));
}

Теперь вы можете разрешить зависимости в модели представления:

public ViewModel(IUnityContainer container)
{
    Model model = container.Resolve<Model>();
}
0 голосов
/ 18 августа 2011

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

public WizardData wd = new WizardData();

Затем каждая страница мастера инициализируется этим экземпляром wd, то есть

public FirstWizardPage(WizardData wd)
{
    this.wizardData = wd;
}

Таким образом, таким образом вы можете иметь кнопку Finish на каждой страниценапример.Вы можете инициализировать ViewModel с помощью wd или его свойств.

Этот путь не самый лучший.Это должно быть одним из возможных способов.

Другое - это создание синглтона и его использование без ссылки, переходящей со страницы на страницу.

...