如果禁用命令,如何更改上下文菜单项样式

时间:2012-07-20 11:09:43

标签: c# wpf contextmenu

我有一个上下文菜单,在某些时候我禁用一些绑定到上下文菜单项的命令。

什么有效:

当命令被禁用时,单击菜单项不会根据需要调用命令的execute方法。

什么行不通:

两个可以执行的命令和那些看起来不一样的命令!! 我的用户无法区分。

问题:

如何更改样式以显示此更改。改变背景颜色,边框颜色,地面颜色,工具提示...任何事都可以接受..

我尝试使用xaml并且无法解决这个问题。 (我是xaml的菜鸟,所以我的尝试甚至不值得在这里粘贴:))

提前致谢

xaml:

<Border BorderThickness="1" MinWidth="100"  Background="Transparent"  ContextMenu="{Binding Path=ContextMenu}" BorderBrush="{Binding Path=BorderColor}">

的结合:

public override ContextMenu ContextMenu
        {
            get
            {
                return new ContextMenu
                           {
                               ItemsSource = new ObservableCollection<MenuItem>
                                                 {
                                                     new MenuItem
                                                         {
                                                             Header = IsSharedFieldView? "Delete Shared Field" :"Delete Field" ,
                                                             Command = DeleteFieldCommand 
                                                         }
                                                 }
                           };

            }
        }

3 个答案:

答案 0 :(得分:3)

这里的诀窍是ContextMenu实际上是从ItemsControl继承的,这可以在我的机器上运行:

/// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            this.DataContext = this;
            InitializeComponent();

            MenuItems = new ObservableCollection<KeyValuePair<string, ICommand>>();
            MenuItems.Add(new KeyValuePair<string, ICommand>("One", OneCommand));
            MenuItems.Add(new KeyValuePair<string, ICommand>("Two", null));
        }

        public ObservableCollection<KeyValuePair<String, ICommand>> MenuItems { get; set; }

        #region OneCommand
        DelegateCommand _OneCommand;
        public DelegateCommand OneCommand
        {
            get { return _OneCommand ?? (_OneCommand = new DelegateCommand(One, CanOne)); }
        }

        public bool CanOne()
        {
            return false;
        }

        public void One()
        {

        }
        #endregion
    }

和XAML:

<Window x:Class="DynamicContextMenuTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Path Data="M 10,2 L 17.5,2 L 17.5,0 L 23,4.5 L 17.5,9 L 17.5,7.3 L 10,7.3 L 10,2" Fill="Green">
            <Path.ContextMenu>
                <ContextMenu ItemsSource="{Binding MenuItems}" DisplayMemberPath="Key">
                    <ContextMenu.Resources>
                        <Style TargetType="MenuItem">
                            <Setter Property="Command" Value="{Binding Value}" />
                            <Style.Triggers>
                                <Trigger Property="IsEnabled" Value="False">
                                    <Setter Property="Background" Value="Red" />
                                </Trigger>
                            </Style.Triggers>
                        </Style>
                    </ContextMenu.Resources>
                </ContextMenu>
            </Path.ContextMenu>
        </Path>
    </Grid>
</Window>

请注意以下几点:

  • 您不再绑定到ContextMenu(视图模型不应该知道控件),而是绑定到string(标题)/ ICommand(命令)
  • 的集合
  • 当项目的命令CanExecute返回false时,绑定控件的IsEnabled属性变为false。您可以在该属性上设置触发器以修改绑定控件的外观。

答案 1 :(得分:1)

    <Window.Resources>
        <Style TargetType="{x:Type MenuItem}">
            <Style.Triggers>
                <Trigger Property="IsEnabled" Value="False">
                    <Setter Property="Background" Value="Black"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Grid>
        <TextBox >
            <TextBox.ContextMenu>
                <ContextMenu>
                    <Menu>
                        <MenuItem Header="Add" IsEnabled="False"/>
                        <MenuItem Header="Delete"/>
                    </Menu>
                </ContextMenu>
            </TextBox.ContextMenu>
        </TextBox>
    </Grid>

它只是演示,你可以从中得到这个想法。并且您可以将IsEnabled绑定到VM Command.CanExecute。我希望这会有所帮助。

答案 2 :(得分:0)

有效的解决方案:

最初我从我的视图模型绑定了一个ContextMenu,并且isEnabled无效。

而不是我在xaml中创建了上下文菜单,并从viewModel绑定了itemsSource。

现在菜单项被禁用,触发器正在运行。

不确定我做错了什么,但这解决了它:)