Die Bindung an eine RoutedUICommand, das nicht im codebehind
Ich habe eine statische Klasse, die enthält eine RoutedUICommand, dass, würde ich mag zu verwenden, in der Bindung.
public static class CommandLibrary
{
public static ProjectViewModel Project { get; set; }
public static RoutedUICommand AddPage { get; private set; }
static CommandLibrary()
{
AddPage = new RoutedUICommand("AddPage", "AddPage", typeof(CommandLibrary));
}
public static void AddPage_Executed(object sender, ExecutedRoutedEventArgs args)
{
Project.AddPage();
}
public static void AddPage_CanExecute(object sender, CanExecuteRoutedEventArgs args)
{
//We need a project before we can add pages.
if (Project != null)
{
args.CanExecute = true;
}
else
{
//Did not find project, turning Add Page off.
args.CanExecute = false;
}
}
}
Wenn ich Versuch, ein CommandBinding für diese AddPage Befehl, VS bekommt einen Wutanfall, weil er sich beschwerte, dass es nicht finden können, AddPage_CanExecute in Window1... Das macht keinen Sinn, wenn man bedenkt, dass all die Beispiele, die ich gesehen habe zeigen, das XAML-sollte in Ordnung sein, bedenkt man den code habe ich in:
<Window x:Class="MyProject.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyProject">
<Menu>
<Menu.CommandBindings>
<CommandBinding Command="local:CommandLibrary.AddPage"
Executed="AddPage_Executed" CanExecute="AddPage_CanExecute" />
</Menu.CommandBindings>
<MenuItem Header="_Page">
<MenuItem Header="_New" Command="local:CommandLibrary.AddPage" />
</MenuItem>
</Menu>
</Window>
Ich hab auch schon versucht auch nicht das Menü.CommandBindings Abschnitt und einfach diesen (als pro diese Frage, die nahelegt, diese aber nicht spezifisch ist):
<MenuItem Header="_New" Command="{x:Static local:CommandLibrary.AddPage}" />
Dass staunched den Fluss der Fehler, aber der Menüpunkt, den es generiert, wird immer deaktiviert! Die CanExecute-scheint nie zu bekommen, genannt. Ich gehe davon aus, dass die Bindung versagt in diesem Fall, wie auch, aber leiser.
Warum VS hasse meinen Befehl und verweigern den Blick in die richtige Stelle zu finden, die Sie Ausgeführt werden, und die CanExecute-Methode? Ich habe gesehen, eine Reihe von Beispielen (in Pro WPF von Matthew McDonald und auf mehreren benutzerdefinierten Befehl Lernprogramme online), die dies getan haben, so wie ich bin, es zu tun.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen
CommandBinding
ist genau wie jedes andere element im visual tree. Alle angegebenen Ereignisse werden behandelt, indem die Wurzel Ihrer visuellen Struktur (IhreWindow
in diesem Fall). Das bedeutet, dass, wenn Sie bewegen Sie denAddPage_Executed
undAddPage_CanExecute
dem Fenster des code-hinter, es wird funktionieren. Diese können Sie verwenden Sie den gleichen Befehl in viele UI-Komponenten, sondern haben unterschiedliche Handler.Ich sehe allerdings, dass Ihr Befehl ausgeführt wird, eine gewisse Logik gegen deine Ansicht-Modell. Um Zeit zu sparen und frustration zu verstehen, dass geroutet Befehle sind die falsche Lösung hier. Stattdessen Kapseln Ihren Befehl im view-Modell so etwas wie dieses:
Einen
DelegateCommand
ist eine Implementierung vonICommand
aufruft, die Delegierten und ausführen der Abfrage den Befehl. Das bedeutet, dass die Befehls-Logik, die alle eingewickelt in den Befehl und Sie brauchen nicht einCommandBinding
zu bieten-Handler (Sie brauchen nicht eineCommandBinding
überhaupt). Damit Ihre anzeigen nur an Ihre VM wie folgt:Ich schlage vor, Sie Lesen Sie durch diese Reihe von Beiträgen, um Ihnen noch mehr Kontext: