Ho una classe statica che contiene un RoutedUICommand che vorrei usare nel binding.Collegamento a un RoutedUICommand che non è nel codebehind
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;
}
}
}
Quando si tenta di creare un CommandBinding per questo comando AddPage, VS fa i capricci, lamentando che non riesce a trovare AddPage_CanExecute in Window1 ... che non ha senso se si considera che tutti gli esempi che ho visto indica questo XAML dovrebbe andare bene considerando il codice che ho posto:
<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>
ho anche provato non inclusa la sezione Menu.CommandBindings e semplicemente usando questa (come da this question che suggerisce questo, ma non è specifico):
<MenuItem Header="_New" Command="{x:Static local:CommandLibrary.AddPage}" />
Questo ha bloccato il flusso di errori ma la voce di menu che genera è sempre disabilitata! CanExecute non sembra mai essere chiamato. Suppongo che l'associazione stia fallendo anche in questo caso, anche se più tranquillamente.
Perché VS odia il mio comando e si rifiuta di cercare nel posto giusto per trovare i metodi Executed e CanExecute? Ho visto un certo numero di esempi (in Pro WPF di Matthew McDonald e su diversi tutorial di comando personalizzati online) che hanno fatto ciò mentre lo sto facendo.
Ottima risposta. Mi ha preso quello di cui avevo bisogno. Ho letto alcuni tutorial di MVVM e ho visto questo tipo di uso del comando prima, ma non riuscivo a ricordare come farlo, quindi ho fatto ricorso alle soluzioni che ho trovato nei miei libri e tramite la ricerca. Grazie per l'aiuto. – evizaer
Bellissima. Stavo sbattendo la testa su questo ... imparare wpf + mvvm non è così semplice come vorrei. RoutedUIC indicava dove troppo complesso per quello che intendevo e sapevo che ci dovrebbe essere un modo più semplice. @Kent, grazie per i tuoi esempi e blog. –