![](/img/trans.png)
[英]WPF MenuItem Command.Executed not firing, but Command.CanExecute does
[英]WPF:MenuItem Command Canexecute not working as expected
好吧,我的要求很簡單
如果未啟用子菜單,則應禁用父菜單項。
這是代碼。
<Grid>
<Menu>
<MenuItem Header="File" >
<MenuItem Header="Open" IsEnabled="{Binding IsEnabled, ElementName=subMenu2}">
<MenuItem Header="Open_Extended1" x:Name="subMenu2" Command="{Binding SomeCommand}"/>
</MenuItem>
<MenuItem Header="Add"/>
</MenuItem>
</Menu>
</Grid>
對於背后的代碼:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new ViewModel();
}
}
public class SomeCommand : System.Windows.Input.ICommand
{
private ViewModel Model;
public SomeCommand(ViewModel model)
{
Model = model;
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public bool CanExecute(object parameter)
{
return Model.IsEnabled;
}
public void Execute(object parameter)
{
}
}
public class ViewModel : System.ComponentModel.INotifyPropertyChanged
{
private System.Boolean mIsEnabled;
public System.Boolean IsEnabled
{
get
{
return mIsEnabled;
}
set
{
mIsEnabled = value;
OnPropertyChanged("IsEnabled");
}
}
private SomeCommand mSomeCommand;
public SomeCommand SomeCommand
{
get
{
if (mSomeCommand == null)
{
mSomeCommand = new SomeCommand(this);
}
return mSomeCommand;
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
現在的問題是,打開菜單項一直處於啟用狀態,直到將其懸停為止(默認情況下未禁用),因為懸停了打開菜單項時將調用subMenuItem命令的CanExecute。
當我們點擊“文件”菜單項時
因此,有什么方法可以集中子菜單,以便可以調用CanExecute嗎?
您的要求直接與Menu類的設計背道而馳。 在不顯示該子菜單的情況下刷新它會非常棘手和混亂。
但這不是一個大問題,您可以在ViewModel中輕松解決它。 引入一個OpenEnabled
屬性並綁定到該屬性。
您應該為“ Open Menu item
創建一個command
,如下所示:
public RelayCommand OpenCommand { get; set; }
現在,將Open MenuItem
綁定到以下Command
:
<MenuItem Header="Open" Command="{Binding Command}">
CanExecute
def將是:
public bool CanExecuteOpen
{
get
{
//Can also check several menu items command here
return CanExecuteOpen_Extended1;
}
}
public bool CanExecuteOpen_Extended1
{
get
{
//Any logic for this command
return false;
}
}
理想情況下,如果要從
ViewModel
生成MenuItems
,它將更加簡單,然后可以輕松編寫用於啟用Parent
menu Item
的通用定義。 但是,由於您的菜單項已在XAML中修復,因此我們必須指定應為父項檢查哪個子項命令。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.