Совместное использование контекста между моделями представления - PullRequest
1 голос
/ 08 января 2011

Я создаю свое первое приложение Silverlight. Это приложение имеет несколько форм, которые позволяют пользователю сохранять клиентов, поставщиков, персонал и т. Д. Каждая страница имеет один родительский пользовательский элемент управления (с соответствующей моделью представления) и один или несколько дочерних пользовательских элементов управления (каждый со своей собственной моделью представления). Например, клиентская форма будет иметь Customer usercontrol в качестве родителя, а Address Usercontrol, Phone Numbers UserControl as Child будет контролировать пользователя в форме. Теперь родительский «Клиент» отвечает за сохранение данных для Клиента, Адреса и Телефона, когда пользователь нажимает кнопку «Сохранить». За кулисами я мог бы поделиться экземпляром datacontext между моделями представления клиента, адреса и номера телефона. Поэтому, когда нажимается кнопка «Сохранить», пользовательский пользовательский контроль может сохранять данные для всех трех (так как его текстовый текст также будет содержать объекты Address и PhoneNumber).

Что я хотел бы знать, как передать этот текст данных от Клиента на адрес и номер телефона? Одним из способов может быть передача datacontext в модель представления адреса и номера телефона в соответствующих конструкторах, но тогда мне нужно будет обеспечить, чтобы конструкторы Address и PhoneNumber вызывались только после того, как была создана модель представления Customer. может ли быть лучшее решение? Предлагает ли MEF лучшее решение?

Ответы [ 2 ]

1 голос
/ 10 января 2011

У вас есть сила Silverlight на стороне клиента. Значение: у вас есть статика :-)

То, как я это делал в нашем последнем приложении, заключалось в создании ContextCache. По сути, это статический класс, который содержит все мои контексты RIA для использования в любой из моих моделей ViewModel. Вот так:

public static class ContextCache
  {
    private static TicketContext _ticketContext;

    public static TicketContext TicketContext
    {
      get
      {
        if (_ticketContext == null)
          _ticketContext = new TicketContext();

        return _ticketContext;
      }
      private set { _ticketContext = value; }
    }
  }

Итак, в ViewModel вы просто вызываете ContextCache.TicketContext и можете сохранять изменения. Таким образом, вы можете воспользоваться всеми возможностями отслеживания изменений состояния в RIA и позволить ему обрабатывать все подробности о сохранении объектов (если вы правильно закодировали свои службы, но это уже другая история).

0 голосов
/ 09 января 2011

Возможно, с вашей архитектурой плохое решение может быть с IsolatedStorageFile, которое вы можете имитировать сессию ASP.NET!

Насколько я понимаю, вы пытаетесь использовать шаблон MV-VM в своем приложении! Одна из важных причин, по которой ViewModel появился в нашей жизни, это тестируемый модуль! Если бы я был тобой, у меня был бы Customer ViewModel и я использовал бы его во всех моих child-usercontrols !

В зависимости от сложности и изоляции, если дочерние элементы управления требуют отдельного ViewModel, вы можете считать родителя ViewModel и иметь свойства дочернего элемента ViewModel.

public class ParentViewModel : FrameworkElement {

    Child1ViewModel Child1 { get; set; } //Must be a dependency property

    Child1ViewModel Child2 { get; set; } //Must be a dependency property

    ICommand SaveButtonCommand; //Your delegate command of your save button

    public ParentViewModel() {
        Child1 = new Child1ViewModel();
        Child2 = new Child2ViewModel();
    }
}

И вы можете использовать это родительское представление на вашем Родителе XAML

<UserControl.DataContext>
    <ViewModels:ParentViewModels />
</UserControl.DataContext>
<Controls:Child1 DataContext="{Binding Child1}" />
<Controls:Child2 DataContext="{Binding Child2}" />

У вас также есть ICommand SaveButtonCommand в вашем ParentViewModel и манипуляция с properties в вашем ребенке ViewModel при нажатии!

Надеюсь, это помогло!

...