Patrón Messenger para hacer golferías

¡Esto es casi un hack, casi una trampa!

Observa y caga blandito con este ejemplo de un árbol generado en el ViewModel y representado en la vista. Al pulsar sobre un nodo ¡el ViewModel se entera de todo! ¡Es un topo! Te empaqueto el ejemplo porque sé que un día de estos se te va a olvidar y lo querrás todo mascadito. Golfo, que eres un golfo.

image

Así queda el temario, para que identifiques claramente qué cojones vamos a hacer.

https://skydrive.live.com/redir?resid=C8B0DBB75540E8D5!25872&authkey=!AAmYXeD4O0cUpyA

Y sobre todo, atento a esta parte:

using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using GalaSoft.MvvmLight;
using System.Linq;
using GalaSoft.MvvmLight.Messaging;

namespace Tree.ViewModel
{
    /// <summary>
    /// This class contains properties that the main View can data bind to.
    /// 
    /// Use the <strong>mvvminpc</strong> snippet to add bindable properties to this ViewModel.
    /// 
    /// 
    /// You can also use Blend to data bind with the tool's support.
    /// 
    /// 
    /// See http://www.galasoft.ch/mvvm
    /// 
    /// </summary>
    public class MainViewModel : ViewModelBase
    {
        private ObservableCollection _form;
        private Form _selectedForm;


        /// <summary>
        /// Initializes a new instance of the MainViewModel class.
        /// </summary>
        public MainViewModel()
        {
            ////if (IsInDesignMode)
            ////{
            ////    // Code runs in Blend --> create design time data.
            ////}
            ////else
            ////{
            ////    // Code runs "for real"
            ////}

            var modeloForms = new ObservableCollection
                        {
                            new Form{ 
                                Name = "Form1",
                                Children = new Collection
                                               {
                                                   new Form{ 
                                                       Name = "Hijo 1",
                                                       Children = new Collection
                                                                      {
                                                                          
                                                                          new Form {Name = "Hijillo pequeño 1"},
                                                                      }
                                                   },
                                                   new Form{ Name = "Hijo 2"},
                                               },


                            }
                        };
          
            Forms = new ObservableCollection(modeloForms.Select(form => new FormViewModel(form)));

            Messenger.Default.Register<PropertyChangedMessage>(
              this,
              OnIsSelectedChanged);
        }

        private void OnIsSelectedChanged(PropertyChangedMessage obj)
        {
            var viewModel = obj.Sender as FormViewModel;
            if (viewModel != null && viewModel.Children == null)
            {
                SelectedForm = viewModel.Form;
            }
        }

        public ObservableCollection Forms
        {
            get { return _form; }
            set
            {
                _form = value;
                RaisePropertyChanged(() => Forms);
            }
        }

        public Form SelectedForm
        {
            get { return _selectedForm; }
            set
            {
                _selectedForm = value;
                RaisePropertyChanged(() => SelectedForm);
            }
        }
    }
}
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using GalaSoft.MvvmLight;

namespace Tree
{
    public class FormViewModel : ViewModelBase
    {
        private Form _form;
        private bool _isSelected;
        private IList _children;

        public FormViewModel(Form form)
        {
            _form = form;

            if (form.Children != null)
            {
                Children = form.Children.Select(form1 => new FormViewModel(form1)).ToList();
            }
        }


        public Form Form
        {
            get { return _form; }
            set
            {
                _form = value;
                RaisePropertyChanged(() => Form);
            }
        }

        public IList Children
        {
            get { return _children; }
            set
            {
                _children = value;
                RaisePropertyChanged(() => Children);
            }
        }

        public bool IsSelected
        {
            get
            {
                return _isSelected;
            }
            set
            {
                var old = _isSelected;
                _isSelected = value;
                RaisePropertyChanged(() => IsSelected, old, value, true);
            }
        }



    }
}

Pego el codiguejo para que además tengas ese apoyo visual que tanto nos gusta. Y qué pongo aquí? Pues el RaisePropertyChanged con 4 parámetros. Surprising! Bueno, ¡pruébalo y saborea su miel YA!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s