none
Pasar parametro a Comando en aplicacion WPF con MVVM RRS feed

  • Pregunta

  •  Buenas, estoy realizando una pequeña aplicacion WPF para iniciarme en el patron MVVM; el caso es que tengo un < stackpanel > que relleno con un lista de botones dinamica.

    La lista de Botones la creo de la siguiente forma en mi ViewModel: 

    private void CargarSistemasExecute()
            {
                _listaBotonesSistema = new ObservableCollection<Button>();
    
                for (int i = 0; i < listaSistemas.Count; i++)
                {
                    string sId = "" + listaSistemas[i].Id;
                    Button btSistema = new Button();
                    btSistema.Content = listaSistemas[i].Nombre;
                    btSistema.Uid = sId;
                    btSistema.Margin = new Thickness(10);
                    btSistema.FontStyle = FontStyles.Italic;
                    btSistema.Background = Brushes.Azure;
                    btSistema.SetBinding(Button.CommandProperty, new Binding("SeleccionarSistema"));
                    if (listaSistemas[i].Id == IdSistema)
                    {
                       btSistema.Background = Brushes.Violet;
                    }
    
                    _listaBotonesSistema.Add(btSistema);
                }
    
                NotifyPropertyChanged("BotonesSistemas");
                
            }
    

     El caso es que todos los Botones tienen el Command Bindeado al mismo Comando "SeleccionarSistema" por lo que nunca se que boton de la lista he pulsado, he intentado leer varios tutoriales pero mi ingles es limitado y no consigo encontrar un ejemplo de lo que yo pretendo.

    ¿ Podrian indicarme como puedo saber el Id del boton que he pulsado ? ¿ Se pueden pasar parametros a un comando ? Dejo aqui como tengo hecha la declaracion de mi comando por si sirve de algo

    public ICommand SeleccionarSistema
            {
                get
                {
                    if (_seleccionarsistema == null)
                    {
                        _seleccionarsistema = new BaseComandos(SeleccionarSistemaExecute, _canExecute);
                    }
                    return _seleccionarsistema;
                }
    
                    //     return _seleccionarsistema ?? (_seleccionarsistema = new BaseComandos(() => SeleccionarSistemaExecute(), _canExecute)); }
            }

     La Clase BaseComandos es la tipica que implementa ICommand sin nada mas, tambien se la dejo por si las moscas.

    public class BaseComandos : ICommand
        {
            private Action _action;
            private bool _canExecute;
    
            public event EventHandler CanExecuteChanged;
    
            public BaseComandos(Action action, bool canExecute)
            {
                _action = action;
                _canExecute = canExecute;
            }
    
            public bool CanExecute(object parameter)
            {
                return _canExecute;
            }
            
            public void Execute(object parameter)
            {
                _action();
            }
    
        }

     

    martes, 10 de mayo de 2016 20:33