Pregunta

Estoy usando MVVM-Light y tengo mi comando de retransmisión funcionando perfectamente, acabo de leer que debería estar implementando CanExecuteChanged y CanExecute. Aunque no puedo encontrar un buen ejemplo.

¿Alguien tiene un buen ejemplo de cómo implementarlos?

Canexecute necesita devolver falso cuando no se puede ejecutar, pero ¿no solo desbasará el botón?

¿Cuándo ejecuto el CanExecuteChanged?

Cualquiera tiene buenos ejemplos de cuándo usar cada uno, mi código funciona sin sino este blog Publicación establece que debería estar implementando estos elementos.

Estoy un poco confundido, como dije pensé que solo ataría al Enabled Propiedad o algo así a una propiedad en el Modelo ViewModel para que pueda deshabilitar el botón o un control similar?

Cualquier ayuda para comprender sería realmente agradecida.

EDITAR

Esto es lo que tengo ahora ... está funcionando pero el botón no está deshabilitado físicamente, solo el Commmand no se ejecuta ya que estoy devolviendo falso. Estoy llamando a Canexecuteme en el constructor para forzar el RaisecanExecuteChanged a ejecutar ...

Esto se ejecuta en mi construtor de mi ViewModel

        this.Page2Command = new RelayCommand(() => this.GoToPage2(), () => CanExecuteMe);

        CanExecuteMe = false;

Y aquí está el resto de mi código, lo tomé de un ejemplo.

    private bool _canIncrement = true;

    public bool CanExecuteMe
    {
        get
        {
            return _canIncrement;
        }

        set
        {
            if (_canIncrement == value)
            {
                return;
            }

            _canIncrement = value;

            // Update bindings, no broadcast
            //RaisePropertyChanged(CanIncrementPropertyName);

            Page2Command.RaiseCanExecuteChanged();
        }
    }

    public RelayCommand Page2Command
    {
        get;
        private set;
    }

    private object GoToPage2()
    {
        System.Windows.MessageBox.Show("Navigate to Page 2!");
        return null;
    }

Y aquí esta mi xaml

  <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="31,77,0,0" x:Name="button1" VerticalAlignment="Top" Width="75" >
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click">
                    <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding Page2Command, Mode=OneWay}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Button>
¿Fue útil?

Solución

Canexecute se llama cuando el botón necesita determinar si debe estar habilitado o no.

El botón hace esto en la vinculación, y después de cada vez que CanExecuteChanged se dispara (el botón escucha este evento para su comando).

Entonces, si el botón debe deshabilitarse, debe disparar a CanexecuteChanged y, cuando el botón llama a CanExecute, debe regresar false. Este es el método preferido para habilitar/deshabilitar un botón al usar enlaces de comando.

Los enlaces de comando le permiten encapsular toda la lógica del botón dentro de una instancia (el comando). El método CanExecute debe consultar el estado actual de la aplicación para determinar si el botón debe estar habilitado o deshabilitado. Según esta encapsulación, reduce el código de espagueti en su modelo de vista, donde estos controles se realizan aquí y allá y allá y lo olvidé de ese allí.

Otros consejos

Debe tener mucho cuidado utilizando el predicado de canexecute. Verifica cada cambio de interfaz de usuario y para cada tecla de teclado ingresada en cualquier campo.

¡Esto puede causar problemas de rendimiento!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top