我有兩個選單項,“訊息”和“檢查”。“檢查”是可檢查的,并且在標題附近有一個復選框。我想通過單擊“檢查”取消選中它,并禁用“訊息”項。另外,我想通過單擊和使用快捷方式來做到這一點。我寫了一些額外的類,比如 RelayCommand
public class RelayCommand : ICommand
{
private Action<object> _execute;
private Func<object, bool> _canExecute;
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested = value; }
remove { CommandManager.RequerySuggested -= value; }
}
public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
{
_canExecute = canExecute;
_execute = execute;
}
public bool CanExecute(object parameter)
{
return _canExecute == null || _canExecute(parameter);
}
public void Execute(object parameter)
{
_execute(parameter);
}
}
可觀察物件(類似于 INotifyOnPropertyChanged)
public class ObservableObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler? PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}
和 MainViewModel 類
public class MainViewModel : ObservableObject
{
private readonly MainWindow _mainWindow;
private bool _isChecked { get; set; } = true;
public bool IsChecked
{
get
{
return _isChecked;
}
set
{
_isChecked = value;
OnPropertyChanged();
}
}
public RelayCommand Check { get; set; }
public MainViewModel(MainWindow mainwindow)
{
_mainWindow = mainwindow;
IsChecked = false;
Check = new RelayCommand(o =>
{
if (IsChecked == false)
{
_mainWindow.Message_menu_item.IsEnabled = true;
IsChecked = true;
}
else
{
_mainWindow.Message_menu_item.IsEnabled = false;
IsChecked = false;
}
});
}
}
我的 xml
<MenuItem Header="File">
<MenuItem
Name="Message_menu_item"
InputGestureText="Ctrl M"
Header="_Message"/>
<MenuItem
Name="Check_menu_item"
InputGestureText="Ctrl C"
Command="{Binding Check}"
Header="Check"
IsCheckable="True"
IsChecked="{Binding IsChecked}"/>
<Separator />
<MenuItem Header="Exit"
InputGestureText="Ctrl E"/>
</MenuItem>
和系結
<KeyBinding Key="C" Modifiers="Ctrl" Command="{Binding Check}"/>
我想啟動一個帶有選中復選框和可用訊息選單項的應用程式,但它開始未選中,通過單擊它,它只是禁用訊息,并忽略復選框(它只作業,再次單擊它不會改變任何事物)。它只能使用快捷方式正常作業,但在我的情況下,我只能在單擊選單下拉按鈕“檔案”后使用快捷方式(像這樣,如果它關閉,快捷方式不起作用
)我不明白為什么它作業太奇怪了,請幫忙。
uj5u.com熱心網友回復:
我想用選中的復選框啟動一個應用程式
IsChecked = false;如果是這樣,您應該相應地更改視圖模型建構式中的初始化。
復選框的奇怪行為是IsChecked從Check命令修改并將其系結到IsChecked選單項的屬性而不指定模式(這導致雙向系結)的結果。因此,在使用選單時,該屬性會切換兩次:通過命令和通過系結。使用鍵系結有效,因為它只觸發命令。
要解決此問題,請將系結模式更改為OneWay或不更改命令中的屬性值。
此外:您應該從視圖模型中洗掉對視窗的參考。這可以通過IsEnabled將訊息選單項的屬性系結到視圖模型上的另一個屬性來實作,如下所示:
public bool IsMessageMenuEnabled => !this.IsChecked;
public bool IsChecked
{
get => this.isChecked;
set
{
this.isChecked = value;
this.OnPropertyChanged();
this.OnPropertyChanged(nameof(this.IsMessageMenuEnabled));
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/521336.html
標籤:wpf虚拟机
上一篇:如何使用以編程方式創建的文本框?
下一篇:任務完成時禁用按鈕
