1

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

什么有效:

当命令被禁用时,单击菜单项不会像我想要的那样调用命令的执行方法。

什么不起作用:

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

问题:

如何更改样式以显示此更改。背景颜色,边框颜色,前景色,工具提示的变化......任何东西都是可以接受的......

我用 xaml 进行了实验,但无法解决这个问题。(我是 xaml 的菜鸟,所以我的尝试甚至不值得在这里粘贴 :))

xml:

<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 
                                                         }
                                                 }
                           };

            }
        }
4

3 回答 3

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(Header)/ ICommand(Command)的集合
  • 当项的命令CanExecute返回 false 时,绑定控件的IsEnabled属性变为 false。您可以在该属性上使用触发器来修改绑定控件的外观。
于 2012-07-20T12:01:37.427 回答
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 。我希望这将有所帮助。

于 2012-07-20T12:00:22.123 回答
0

有效的解决方案:

最初我从我的视图模型中绑定一个 ContextMenu 并且 isEnabled 不起作用。

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

现在菜单项被禁用并且触发器正在工作。

不知道我做错了什么,但这解决了它:)

于 2012-07-23T10:00:59.477 回答