我有一个上下文菜单,在某些时候我禁用一些绑定到上下文菜单项的命令。
什么有效:
当命令被禁用时,单击菜单项不会根据需要调用命令的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
}
}
};
}
}
答案 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>
请注意以下几点:
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。
现在菜单项被禁用,触发器正在运行。
不确定我做错了什么,但这解决了它:)