2016-03-07 61 views
0

好了,所以我的要求很簡單WPF:如預期

如果submenuitem未啓用我應該禁用父菜單項菜單項命令Canexecute不工作。

這是代碼。

<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命令在Open Menuitem懸停時被調用。

不是當我們點擊「文件」菜單項

那麼,有什麼辦法可以集中submenuitem以便它CanExecute被調用?

回答

2

您的要求直接針對菜單類的設計。獲取該子子菜單時不顯示它將非常棘手和雜亂。

但這不是一個大問題,你可以很容易地解決它在你的ViewModel。引入一個OpenEnabled屬性並綁定到該屬性。

+0

好基本上這是一個用戶控件,它已在與每一個視圖模型不同的返回類型CanExecute不同的ViewModels許多意見被使用,所以這將是漫長的每個視圖模型來定義屬性,並將其綁定。 –

+0

我有一個解決方案(更像是一個黑客),我寫在父MenuItem Command =「{Binding SomeCommand}」相同的命令,執行部分將不會被調用,當它被點擊和CanExecute將被調用一次文件菜單是開了,但我選擇相信有更好的選擇。 –

+0

當這件作品出現在許多視圖中時,它應該有它自己的(Sub)ViewModel。一般而言,您可以爲一臺虛擬機擁有多個視圖,但不能以其他方式運行。 –

0

您應該創建一個更commandOpen Menu item爲:

public RelayCommand OpenCommand { get; set; } 

現在綁定打開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爲使 Parentmenu Item也很容易編寫。但由於您的菜單項目 已在XAML中修復,我們必須指定應爲父項檢查哪個子項目命令 。