Compartir contexto entre modelos de vista

Estoy construyendo mi primera aplicación Silverlight. Esta aplicación tiene varios formularios que permiten al usuario guardar Clientes, Proveedores, Personal, etc. Cada página tiene un control de usuario principal (con un modelo de vista correspondiente) y uno o más controles de usuario secundarios (cada uno con un modelo de vista propio). Por ejemplo, el formulario de cliente tendría el control de usuario del cliente como control de usuario principal y el control de usuario de dirección, los números de teléfono UserControl como controles de usuario secundarios en el formulario. Ahora, el "Cliente" principal es responsable de garantizar que los datos se guarden para el Cliente, la Dirección y el Teléfono cuando el usuario hace clic en el botón Guardar. Detrás de escena, podría compartir una instancia de contexto de datos entre los modelos de vista de cliente, dirección y número de teléfono. Entonces, cuando se hace clic en el botón Guardar, el control de usuario del cliente podría guardar datos para los tres (ya que su contexto de datos también tendría las entidades Dirección y Número de teléfono).

¿Qué me gustaría saber cómo pasar este contexto de datos del cliente a la dirección y al número de teléfono? Una forma podría ser pasar el contexto de datos al modelo de vista de dirección y número de teléfono en sus respectivos constructores, pero luego necesitaría asegurarme de que los constructores de dirección y número de teléfono sean llamados solo después de que se haya creado el modelo de vista del cliente. ¿Puede haber una mejor solución? ¿MEF ofrece alguna solución mejor?

preguntado el 08 de enero de 11 a las 19:01

2 Respuestas

Tiene el poder del lado del cliente de Silverlight. Significado: tienes estática :-)

La forma en que hice esto en nuestra aplicación más reciente fue crear un ContextCache. Básicamente, es una clase estática que contiene todos mis contextos RIA para usar en cualquiera de mis ViewModels. Al igual que:

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; }
    }
  }

Entonces, en un ViewModel, simplemente realiza una llamada a ContextCache.TicketContext y puede guardar los cambios. De esta manera, puede aprovechar todo el seguimiento de cambios de estado en RIA y dejar que maneje todos los detalles sobre la persistencia del objeto (si ha codificado correctamente sus servicios, pero esa es otra historia).

Respondido el 10 de enero de 11 a las 18:01

Quizás con tu arquitectura una mala solución pueda ser con IsolatedStorageFile que puede simular la sesión de ASP.NET!

¡Según tengo entendido, está intentando abusar del patrón MV-VM en su aplicación! Una de las razones importantes ViewModel entró en nuestra vida es debido a la unidad comprobable! Si yo fuera tú, habría tenido un Customer ViewModel y utilícelo en todos mis controles de usuario infantil!

Dependiendo de la complejidad y el aislamiento, si los controles secundarios requieren su propio control separado ViewModel, puedes considerar un padre ViewModel y tener propiedades del niño 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();
    }
}

Y puede utilizar esta vista de padres en su XAML

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

Tu también tienes ICommand SaveButtonCommand en su ParentViewModel y manipular con el properties en tu hijo ViewModel cuando se hace clic!

Espero que haya sido de ayuda!

Respondido el 09 de enero de 11 a las 10:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.