Archivo de la etiqueta: comunicar formularios de una forma desacoplada

Comunicar Formularios usando Easy.MessageHub

 

Easy.MessageHub es un framework que por dentro viene implementado el patrón Event Aggregator, que justamente basandose en eventos permite una comunicación desacoplada entre formularios sin relación directa en nuestra aplicación.

EventAggregator: Por el nombre es fácil decir que los agregados de eventos un Publisher/Subscriber trabajan con EventAggregator como un centro cuya tarea consiste en agregar todos los mensajes publicados y enviar el mensaje a los suscriptores interesados.

EventAggregator

Antes de comenzar hay que instalar Easy.MessageHub ejecutar el siguiente comando en la consola de administación de paquetes.

Install-Package Easy.MessageHub

Una vez instalado pasamos a crear una clase como contrato para dichos eventos.

 public class VariableSelected
      {
          public int Codigo { get; set; }
          public string StrValor { get; set; }
      }
Desde el formulario hijo implementamos MessageHub
public partial class FrmBusqueda : Form
    {

        private readonly IMessageHub _eventHub;

        public FrmBusqueda(string title, EnumAsignacionTablas t)
        {
            _titulo = title;
            _table = t;
            CompleteEvent.Complete += CompleteEvent_Complete;
            InitializeComponent();
        }

        public FrmBusqueda(string title, EnumAsignacionTablas t, IMessageHub evenHub)
            : this(title, t)
        {
            _eventHub = evenHub;
        }

	private void ObtenerId()
        {
            if (dgvBusqueda.Rows.Count > 0)
            {
                if (dgvBusqueda.CurrentRow != null)
                {
                    _idRow = Convert.ToInt32(dgvBusqueda.CurrentRow.Cells[0].Value);
                    _desRow = Convert.ToString(dgvBusqueda.CurrentRow.Cells[1].Value);
                }
                _eventHub.Publish(new VariableSelected {Codigo = _idRow, StrValor = _desRow});
            }
        }
El padre recibe los datos y los procesa
private void btnBuscarColor_Click(object sender, EventArgs e)
         {
             var argNombreEntidad = new ConstructorArgument("title", StrColour.NameEntity);
             var argT = new ConstructorArgument("t", EnumAsignacionTablas.Colour);
             var frm = CompositionRoot.Resolve<FrmBusqueda>(argNombreEntidad, argT);
             _eventHub.Subscribe<VariableSelected>(OnColorSelected);
             frm.ShowDialog();
         }

        private void OnColorSelected(VariableSelected colorEvent)
         {
             if (colorEvent.Codigo != 0 && !string.IsNullOrEmpty(colorEvent.StrValor))
             {
                 if (DetalleItemColour.Count != 1)
                 {
                     var entity = new Colour()
                     {
                         ColourId = colorEvent.Codigo,
                         Nombre = colorEvent.StrValor
                     };
                     _detalleColour.Add(entity);
                     dgvColor.AutoGenerateColumns = false;
                     dgvColor.DataSource = DetalleItemColour;

                     //De suscribir
                     _eventHub.ClearSubscriptions();
                 }
                 else
                 {
                     MessageBoxEx.EnableGlass = false;
                     MessageBoxEx.Show(this, "Solo se permite un solo Color", StrColour.NameEntity,
                         MessageBoxButtons.OK, MessageBoxIcon.Information);
                     vBool = false;
                     colorEvent.Codigo = 0;
                     colorEvent.StrValor = String.Empty;
                 }
             }
         }