Ho una semplice finestra con un pulsante legato a un ViewModel con un comando.Il pulsante non si disabilita quando il comando CanExecute è falso
Mi aspetto che il pulsante sia disabilitato se MyCommand.CanExecute() è falso. Ma sembra che WPF imposterà la proprietà IsEnabled solo quando la finestra viene disegnata per la prima volta. Qualsiasi azione successiva non influisce sullo stato visibile del pulsante. Sto usando un DelegateCommand di Prism.
mio punto di vista:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button Content="Click Here" Command="{Binding MyCommand}" Width="100" Height="50"/>
</Grid>
e il mio ViewModel:
public class MyVM : NotificationObject
{
public MyVM()
{
_myCommand = new DelegateCommand(DoStuff, CanDoStuff);
}
private void DoStuff()
{
Console.WriteLine("Command Executed");
_myCommand.RaiseCanExecuteChanged();
}
private bool CanDoStuff()
{
var result = DateTime.Now.Second % 2 == 0;
Console.WriteLine("CanExecute is {0}", result);
return result;
}
private DelegateCommand _myCommand;
public ICommand MyCommand
{
get
{
return _myCommand;
}
}
}
50% del tempo, quando i miei applicazione carica, il pulsante è disabilitato correttamente. Tuttavia, se è abilitato al caricamento della finestra, e faccio clic sul pulsante per eseguire il comando, mi aspetto che il 50% del tempo per il pulsante venga disattivato, ma non lo è mai. Il comando non viene eseguito, ma posso ancora fare clic sul pulsante. Come faccio a capire a WPF che il pulsante deve essere disattivato quando CanExecute() è falso?
prima cosa che devi fare è alzare i messaggi di debug per l'associazione dati: http://i.stack.imgur.com/MF8i5.png Avanti, rieseguire e controllare la finestra di output e vedere quali errori ci sono. Se nessuno si riferisce al bind del comando, l'implementazione di 'RaiseCanExecuteChanged()' non è corretta/errata. – Will
Il tuo metodo CanDOStuff è davvero strano! Potrebbe rendere il tuo pulsante disabilitato, ma nel prossimo secondo il tuo comando potrebbe essere eseguito, ma il pulsante è disabilitato ... Davvero strano. ma dovresti chiamare [CommandManager.InvalidateRequerySuggested()] (http://msdn.microsoft.com/en-us/library/system.windows.input.commandmanager.invalidaterequerysuggested.aspx) se CanExecute può essere cambiato e l'interfaccia utente non è aggiornato perché CanExecuteChanged non è stato generato. –
@Viktor So che è davvero strano, dovrebbe essere un esempio sciocco che restituisce vero/falso casualmente. CommandManager.InvalidateRequerySuggested non ha alcun effetto. –