好了,所以我的要求很簡單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被調用?
好基本上這是一個用戶控件,它已在與每一個視圖模型不同的返回類型CanExecute不同的ViewModels許多意見被使用,所以這將是漫長的每個視圖模型來定義屬性,並將其綁定。 –
我有一個解決方案(更像是一個黑客),我寫在父MenuItem Command =「{Binding SomeCommand}」相同的命令,執行部分將不會被調用,當它被點擊和CanExecute將被調用一次文件菜單是開了,但我選擇相信有更好的選擇。 –
當這件作品出現在許多視圖中時,它應該有它自己的(Sub)ViewModel。一般而言,您可以爲一臺虛擬機擁有多個視圖,但不能以其他方式運行。 –