Supongamos que tiene un botón cuya propiedad command
está vinculada a algunos ICommand
del elemento actual de alguna colección.¿Cómo desactivo un botón vinculado a ICommand de un elemento actual cuando no hay un elemento actual?
Cuando la colección es null
, el botón permanece habilitado y al hacer clic parece ser una operación no operativa. En cambio, quiero que el botón permanezca desactivado. Descubrí lo siguiente para mantener los botones desactivados siempre que la colección sea nula. Sin embargo, parece un poco complicado para algo que podría quizás lograr de una manera más natural, más simple y más MVVM.
De ahí la pregunta: ¿hay alguna manera más simple de mantener ese botón deshabilitado, idealmente donde no se usa código subyacente?
.xaml:
<Button Content="Do something" >
<Button.Command>
<PriorityBinding>
<Binding Path="Items/DoSomethingCmd" />
<Binding Path="DisabledCmd" />
</PriorityBinding>
</Button.Command>
</Button>
.cs:
public class ViewModel : NotificationObject
{
ObservableCollection<Foo> _items;
public DelegateCommand DisabledCmd { get; private set; }
public ObservableCollection<Foo> Items {
get { return _items; }
set { _items = value; RaisePropertyChanged("Items"); }
}
public ViewModel()
{
DisabledCmd = new DelegateCommand(DoNothing, CantDoAnything);
}
void DoNothing() { }
bool CantDoAnything()
{
return false;
}
}
Editar:
Un par de notas:
- I soy consciente que puedo usar expresiones lambda, pero en este código de ejemplo no lo hago.
- I saber qué predicado es.
- No veo cómo hacer algo con
DoSomethingCmd.CanExecute
hará cualquier cosa para ayudar, ya que no hayDoSomethingCmd
para acceder mientras no haya un elemento actual. - Así que voy a volver a centrar mi pregunta: ¿Cómo puedo evitar el uso del
DisabledCmd
? No estoy interesado en subir elDoSomethingCmd
ya que no es lo que estoy buscando. De lo contrario, no haría esta pregunta.
Otra edición:
Así que básicamente adoptó esta respuesta como una solución: WPF/MVVM: Disable a Button's state when the ViewModel behind the UserControl is not yet Initialized?
Es, creo, exactamente lo hbarck propone.
¿No desactivaría todos los botones que son parte de los controles estándar de WPF? Pueden usar eventhandlers en lugar de comandos. – STiLeTT