Angenommen, Sie haben eine Schaltfläche, deren command
-Eigenschaft an einige ICommand
des aktuellen Elements einer Sammlung gebunden ist.Wie deaktiviere ich eine Schaltfläche, die an den ICommand eines aktuellen Elements gebunden ist, wenn kein aktuelles Element vorhanden ist?
Wenn die Sammlung null
ist, bleibt die Schaltfläche aktiviert und das Klicken scheint ein No-Op zu sein. Ich möchte stattdessen, dass die Schaltfläche deaktiviert bleibt. Ich habe Folgendes herausgefunden, um die Schaltflächen zu deaktivieren, wenn die Sammlung null ist. Es scheint jedoch etwas zu kompliziert für etwas, das vielleicht in einem natürlicheren, einfacheren und mehr MVVM durchgeführt werden könnte.
Daher die Frage: Gibt es eine einfachere Möglichkeit, diese Schaltfläche deaktiviert zu halten, idealerweise wo kein Code-Behind verwendet wird?
.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;
}
}
bearbeiten:
Ein paar Anmerkungen:
- I bin bewusst,, dass ich Lambda-Ausdrücke verwenden kann, aber in diesem Beispiel Code nicht.
- I wissen, was ein Prädikat ist.
- Ich sehe nicht, wie etwas mit etwas tun, um zu helfen, da es keine
DoSomethingCmd
Zugriff gibt, während es kein aktuelles Element gibt. - Also werde ich meine Frage neu zentrieren: Wie kann ich die Verwendung der
DisabledCmd
vermeiden? Ich bin nicht daran interessiert, dieDoSomethingCmd
zu bewegen, da es nicht das ist, wonach ich suche. Ich würde diese Frage nicht anders stellen.
Ein weiterer edit:
Also im Grunde ich diese Antwort als eine Lösung angenommen: WPF/MVVM: Disable a Button's state when the ViewModel behind the UserControl is not yet Initialized?
Es ist, glaube ich, genau das, was hbarck vorschlägt.
Würde es nicht alle Schaltflächen deaktivieren, die Teil von WPF-Standardsteuerelementen sind? Sie können Eventhandler anstelle von Befehlen verwenden. – STiLeTT