Weiß jemand, wie ich CanExecute
erzwingen kann, um auf einen benutzerdefinierten Befehl (Josh Smith RelayCommand
) aufgerufen werden?Refresh WPF Befehl
In der Regel wird CanExecute
aufgerufen, wenn eine Interaktion auf der Benutzeroberfläche auftritt. Wenn ich auf etwas klicke, werden meine Befehle aktualisiert.
Ich habe eine Situation, in der die Bedingung für CanExecute
wird von einem Timer hinter den Kulissen ein-/ausgeschaltet wird. Da dies nicht durch Benutzerinteraktion ausgelöst wird, wird CanExecute
nicht aufgerufen, bis der Benutzer mit der Benutzeroberfläche interagiert. Das Endergebnis ist, dass meine Button
aktiviert/deaktiviert bleibt, bis der Benutzer darauf klickt. Nach dem Klick wird es korrekt aktualisiert. Manchmal scheint Button
aktiviert zu sein, aber wenn der Benutzer darauf klickt, wird er deaktiviert statt zu feuern.
Wie kann ich eine Aktualisierung im Code erzwingen, wenn der Timer die Eigenschaft ändert, die sich auf CanExecute
auswirkt? Ich habe versucht, PropertyChanged
(INotifyPropertyChanged
) auf die Eigenschaft, die CanExecute
betrifft, feuern, aber das hat nicht geholfen.
Beispiel XAML:
<Button Content="Button" Command="{Binding Cmd}"/>
Beispiel Code hinter:
private ICommand m_cmd;
public ICommand Cmd
{
if (m_cmd == null)
m_cmd = new RelayCommand(
(param) => Process(),
(param) => EnableButton);
return m_cmd;
}
// Gets updated from a timer (not direct user interaction)
public bool EnableButton { get; set; }
Haben Sie versucht, INotifyPropertyChanged für den Befehl zu erhöhen? Sie brauchen kein Feld für den Befehl, sondern geben jedes Mal ein neues zurück. Diese Kombination sollte funktionieren. Oder erstellen Sie einen neuen Befehl nur für den Fall, wenn Sie das Forcen benötigen. – egaga