WPF ViewModel-Befehle CanExecute issue

Ich habe Probleme mit den Kontextmenübefehlen in meinem Ansichtsmodell.

Ich implementiere die ICommand-Schnittstelle für jeden Befehl im View-Modell, erstelle dann ein ContextMenu in den Ressourcen des View (MainWindow) und greife mit einer CommandReference aus dem MVVMToolkit auf die aktuellen DataContext (ViewModel) -Befehle zu.

Wenn ich die Anwendung debugge, wird die CanExecute-Methode für den Befehl anscheinend nur beim Erstellen des Fensters aufgerufen. Daher werden meine Kontextmenüelemente nicht wie erwartet aktiviert oder deaktiviert.

Ich habe eine einfache Probe gekocht hier anbei) das ist ein Hinweis auf meine tatsächliche Anwendung und unten zusammengefasst. Jede Hilfe wäre sehr dankbar!

Dies ist das ViewModel

namespace WpfCommandTest
{
    public class MainWindowViewModel
    {
        private List<string> data = new List<string>{ "One", "Two", "Three" };

        // This is to simplify this example - normally we would link to
        // Domain Model properties
        public List<string> TestData
        {
            get { return data; }
            set { data = value; }
        }

        // Bound Property for listview
        public string SelectedItem { get; set; }

        // Command to execute
        public ICommand DisplayValue { get; private set; }

        public MainWindowViewModel()
        {
            DisplayValue = new DisplayValueCommand(this);
        }

    }
}

Der DisplayValueCommand lautet wie folgt:

public class DisplayValueCommand : ICommand
{
    private MainWindowViewModel viewModel;

    public DisplayValueCommand(MainWindowViewModel viewModel)
    {
        this.viewModel = viewModel;
    }

    #region ICommand Members

    public bool CanExecute(object parameter)
    {
        if (viewModel.SelectedItem != null)
        {
            return viewModel.SelectedItem.Length == 3;
        }
        else return false;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        MessageBox.Show(viewModel.SelectedItem);
    }

    #endregion
}

Und schließlich ist die Ansicht in Xaml definiert:

<Window x:Class="WpfCommandTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfCommandTest"
    xmlns:mvvmtk="clr-namespace:MVVMToolkit"
    Title="Window1" Height="300" Width="300">

    <Window.Resources>

        <mvvmtk:CommandReference x:Key="showMessageCommandReference" Command="{Binding DisplayValue}" />

        <ContextMenu x:Key="listContextMenu">
            <MenuItem Header="Show MessageBox" Command="{StaticResource showMessageCommandReference}"/>
        </ContextMenu>

    </Window.Resources>

    <Window.DataContext>
        <local:MainWindowViewModel />
    </Window.DataContext>

    <Grid>
        <ListBox ItemsSource="{Binding TestData}" ContextMenu="{StaticResource listContextMenu}" 
                 SelectedItem="{Binding SelectedItem}" />
    </Grid>
</Window>

Antworten auf die Frage(5)

Ihre Antwort auf die Frage