WPF ViewModel Commandes CanExecute problème

Je vais avoir quelques difficultés avec les commandes de Menu Contextuel sur mon Modèle de Vue.

Je suis la mise en œuvre de l'interface ICommand pour chaque commande dans le Modèle de Vue, puis la création d'un ContextMenu dans le cadre des ressources de la Vue (MainWindow), et à l'aide d'un CommandReference de la MVVMToolkit pour accéder au DataContext (ViewModel) Commandes.

Quand je debug de l'application, il apparaît que la méthode CanExecute sur la commande n'est pas appelé, sauf à la création de la fenêtre, donc mon Contexte MenuItems ne sont pas activées ou désactivées je me serais attendu.

J'ai concocté un exemple simple (ci-joint) qui est indicatif de mon application effective et résumées ci-dessous. Toute aide serait grandement appréciée!

C'est le 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);
        }

    }
}

La DisplayValueCommand est telle:

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
}

Et enfin, la vue est définie dans le code Xaml:

<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>
bonnes choses... j'ai été à la recherche comment faire cela aujourd'hui! +1

OriginalL'auteur LiamV | 2010-04-06