WPF V4 - MVVM Light V4 (BL16 - Mix11) - RelayCommand - CanExecute no dispara

Estoy tratando de usar la última versión preliminar de MVVM-Light (V4 - BL16 - Mix11) en mi aplicación WPF v4 que estaba usando MVVM-light V3 Sp1.

En mi ViewModel, tengo la siguiente propiedad definida

    private WifiNetwork _selectedNetwork;
    public WifiNetwork SelectedNetwork 
    {
        get
        {
            return _selectedNetwork;
        }
        set
        {
            if (_selectedNetwork == value)
                return;

            _selectedNetwork = value;
            RaisePropertyChanged("SelectedNetwork");
        }
    }

Esta propiedad está enlazada a SelectedItem de ListBox en View XAML.

Tengo el siguiente RelayCommand definido en mi viewModel

    private RelayCommand _connectCommand;
    public RelayCommand ConnectCommand
    {
        get
        {
            if (_connectCommand == null)
            {
                _connectCommand = new RelayCommand(
                    () => ConnectToSpecifiedNetwork(SelectedNetwork),
                    () => SelectedNetwork != null && ! SelectedNetwork.IsConnected);
            }

            return _connectCommand;
        }
    }

Este RelayCommand está vinculado a mi botón "Conectar".

Cuando el elemento seleccionado aún no está conectado (IsConnected es falso), el botón de conexión debería habilitarse.

Esto funcionó perfectamente en MVVM-Light V3 Sp1. Pero cuando utilizo la versión de vista previa MIX 11 de MVVM-Light, parece que ya no funciona.

¿Alguna sugerencia?

Puedo cargar mi proyecto completo en algún lugar si es necesario.

preguntado el 16 de mayo de 11 a las 16:05

Para solucionar este problema, tuve que llamar al método "RaiseCanExecuteChanged ()" en mi propiedad INPC. No tuve que hacer esto (subir manualmente RaiseCanExecuteChanged en un comando) en MVVM-Light V3 Sp1. -

2 Respuestas

La razón es que se eliminó la llamada al CommandManager. Si vuelve a agregar esto, no tendrá que aumentarlo manualmente. Sin embargo, esto no funcionará en Silverlight. Aquí está el código de V3 que parece haber sido eliminado:

    /// <summary>
    /// Occurs when changes occur that affect whether the command should execute.
    /// </summary>
    public event EventHandler CanExecuteChanged
    {
        add
        {
            if (_canExecute != null)
            {
                CommandManager.RequerySuggested += value;
            }
        }

        remove
        {
            if (_canExecute != null)
            {
                CommandManager.RequerySuggested -= value;
            }
        }
    }

    public void RaiseCanExecuteChanged()
    {
#if SILVERLIGHT
        var handler = CanExecuteChanged;
        if (handler != null)
        {
            handler(this, EventArgs.Empty);
        }
#else
        CommandManager.InvalidateRequerySuggested();
#endif
    }

Enlace a V3 RelayCommand

Enlace a V4 RelayCommand

contestado el 18 de mayo de 11 a las 04:05

¡¿Quién diablos te rechazó ?! Gracias por esto, muy apreciado. ¿Crees que no es aconsejable utilizar V4 en aplicaciones de producción? Supuse erróneamente que solo las nuevas funciones eran beta. - dio

Definitivamente no creo que esté mal aconsejado. Es solo una advertencia que debes tener en cuenta. Por cierto, el voto negativo parece haber desaparecido. - Kevindaub

Para solucionar este problema, tuve que llamar al método "RaiseCanExecuteChanged ()" en mi propiedad INPC como se muestra a continuación

    private WifiNetwork _selectedNetwork;
    public WifiNetwork SelectedNetwork 
    {
        get
        {
            return _selectedNetwork;
        }
        set
        {
            if (_selectedNetwork == value)
                return;

            _selectedNetwork = value;

            RaisePropertyChanged("SelectedNetwork");
            // FIX - raise the CanExecuteChanged on the command.
           _connectCommand.RaiseCanExecuteChanged();
        }
    }

No tuve que hacer esto (levantar manualmente RaiseCanExecuteChanged en un comando) en MVVM-Light V3 Sp1.

contestado el 17 de mayo de 11 a las 17:05

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