簡體   English   中英

WPF:MenuItem命令可以執行無法正常工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM