2011-01-08 2 views
1

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

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

ответ

1

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

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

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

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

С моей точки зрения, вы пытаетесь злоупотреблять шаблоном MV-VM в своем приложении! Одна из важных причин, по которой ViewModel пришла в нашу жизнь, - это из-за единиц измерения! Если бы я был вами, у меня был бы Customer ViewModel и использовать его во всех моих детях-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 при нажатии!

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

Смежные вопросы