MVVM WPF命令未触发

时间:2013-05-23 18:04:40

标签: wpf mvvm command prism

我有MVVM WPF个申请。我通过单独的服务创建Menu并设置为加载时间。

包含菜单的我的shell视图如下:

<ItemsControl x:Name="MainToolbar" cal:RegionManager.RegionName="{x:Static inf:RegionNames.MainToolBarRegion}" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="1,1,1,1" RenderTransformOrigin="-0.133,-5.917" Height="28" >
    <ItemsControl.RenderTransform>
        <TransformGroup>
            <ScaleTransform/>
            <SkewTransform/>
            <RotateTransform/>
            <TranslateTransform/>
        </TransformGroup>
    </ItemsControl.RenderTransform>

    <Menu IsMainMenu="True" Margin="0,0,0,0" Height="28" ItemsSource="{Binding Path=Menu}" Width="400">
        <Menu.Resources>
            <Style x:Key="ThemeMenuItemStyle" TargetType="MenuItem" BasedOn="{StaticResource KV_MenuItem}">
                <Setter Property="Header" Value="{Binding Path=Text}"></Setter>
                <Setter Property="Command" Value="{Binding Path=Command}"/>
                <Setter Property="CommandParameter" Value="{Binding Path=Text}"/>
                <Setter Property="IsCheckable" Value="True"/>
                <Setter Property="MinWidth" Value="80"/>
            </Style>
        </Menu.Resources>
    </Menu>
</ItemsControl>

MenuItem背后有一个视图模型:

    public class MenuItemViewModel : NotificationObject
    {

        private string text;
        private ICommand command;
        private IList<MenuItemViewModel> menuItems;

        public MenuItemViewModel()
        {
            this.menuItems = new List<MenuItemViewModel>();
        }

        public string Text
        {
            get
            {
                return text;
            }
            set
            {
                if (text != value)
                {
                    text = value;
                    RaisePropertyChanged(() => this.Text);
                }
            }
        }

        public ICommand Command
        {
            get
            {
                return command;
            }
            set
            {
                if (command != value)
                {
                    command = value;
                    RaisePropertyChanged(() => this.Command);
                }
            }
        }

        public IList<MenuItemViewModel> MenuItems
        {
            get { return menuItems; }
            set
            {
                if (menuItems != value)
                {
                    menuItems = value;
                    RaisePropertyChanged(() => this.MenuItems);
                }
            }
        }
    }

我的接力命令:

    public class RelayCommand : ICommand
    {
        #region Fields

        readonly Action<object> _execute;
        readonly Predicate<object> _canExecute;

        #endregion // Fields

        #region Constructors

        /// <summary>
        /// Creates a new command that can always execute.
        /// </summary>
        /// <param name="execute">The execution logic.</param>
        public RelayCommand(Action<object> execute)
            : this(execute, null)
        {
        }

        /// <summary>
        /// Creates a new command.
        /// </summary>
        /// <param name="execute">The execution logic.</param>
        /// <param name="canExecute">The execution status logic.</param>
        public RelayCommand(Action<object> execute, Predicate<object> canExecute)
        {
            if (execute == null)
                throw new ArgumentNullException("execute");

            _execute = execute;
            _canExecute = canExecute;
        }

        #endregion // Constructors

        #region ICommand Members

        [DebuggerStepThrough]
        public bool CanExecute(object parameter)
        {
            return _canExecute == null ? true : _canExecute(parameter);
        }

        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }

        public void Execute(object parameter)
        {
            _execute(parameter);
        }

        #endregion // ICommand Members
    }

在菜单服务中,我分配命令对象,如下所示:

...
            MenuItemViewModel app = new MenuItemViewModel();
            app.Text = "APP";
            app.Command = new RelayCommand(
                param => this.App(""),
                        param => true);

            MenuItemViewModel exit = new MenuItemViewModel();
            exit.Text = "Exit";
            exit.Command = new RelayCommand(
                        param => this.Exit(""),
                        param => this.CanExit
                        );
            app.MenuItems.Add(exit);
            mService.AddMenu(app);
...

我的MenuItem正在使用指定的标题文本正常加载,但是当我点击一个菜单项时,它没有触发相关的委托方法,例如 App(“”)或Exit(“”)

我做错了什么?

0 个答案:

没有答案