C# 使MenuItem的IsChecked属性与布尔同步
我有一个简单的WPF应用程序,上面有一个菜单。我想添加一个选项,使主窗口保持在其他窗口的顶部 我在属性>设置选项卡中创建了一个名为setTopMost的bool,供用户保存此设置。因此,即使在应用程序终止后,该设置也会被记住 一切正常,我可以单击该选项或使用快捷键Ctrl+T使窗口保持在顶部,但当窗口位于其他窗口顶部时,我无法在该选项旁边显示复选标记 我读过几篇关于绑定IsChecked to a bool的文章,但我自己无法解决这个问题 这是我的密码 MainWindow.xamlC# 使MenuItem的IsChecked属性与布尔同步,c#,wpf,data-binding,C#,Wpf,Data Binding,我有一个简单的WPF应用程序,上面有一个菜单。我想添加一个选项,使主窗口保持在其他窗口的顶部 我在属性>设置选项卡中创建了一个名为setTopMost的bool,供用户保存此设置。因此,即使在应用程序终止后,该设置也会被记住 一切正常,我可以单击该选项或使用快捷键Ctrl+T使窗口保持在顶部,但当窗口位于其他窗口顶部时,我无法在该选项旁边显示复选标记 我读过几篇关于绑定IsChecked to a bool的文章,但我自己无法解决这个问题 这是我的密码 MainWindow.xaml <W
<Window.InputBindings>
<KeyBinding Gesture="Ctrl+T" Command="{Binding TopMostCommand}" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
</Window.InputBindings>
<MenuItem Header="_Options">
<MenuItem x:Name="Menu_AlwaysOnTop" Header="Always On _Top" IsCheckable="True" IsChecked="{Binding isTopMost}" Command="{Binding TopMostCommand}" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}}" InputGestureText="Ctrl+T" />
</MenuItem>
请注意,我做这件事是一种爱好,对这件事很陌生。菜单项没有正确更新的主要原因是您将窗口的DataContext设置为PracticeDataContext
这意味着MainWindow.xaml中的绑定将在PracticeDataContext中查找属性
在这种情况下,您希望在PracticeDataContext类中有一个IsTopMost属性,以便绑定工作
由于直到加载的事件处理程序触发后才设置IsTopMost,因此您应该在PracticeDataContext类中实现INotifyPropertyChanged,以便在通过设置设置设置IsTopMost绑定时收到通知
在INotifyPropertyChanged上快速搜索将显示大量示例。这很简单。绑定只对get/set属性有效
namespace WPF_Practice
{
public partial class MainWindow : Window
{
public bool isTopMost;
public MainWindow()
{
InitializeComponent();
DataContext = new PracticeDataContext();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
isTopMost = Properties.Settings.Default.setTopMost;
Topmost = Properties.Settings.Default.setTopMost;
}
}
public class PracticeDataContext
{
public ICommand TopMostCommand { get; } = new TopMostCommand();
}
public class TopMostCommand : ICommand
{
public void Execute(object parameter)
{
var TopMostClass = new MainWindow();
TopMostClass.WindowTopMost();
}
public bool CanExecute(object parameter)
{
return true;
}
public event EventHandler CanExecuteChanged
{
add => CommandManager.RequerySuggested += value;
remove => CommandManager.RequerySuggested -= value;
}
}
}
public MainWindow()
{
InitializeComponent();
DataContext = new PracticeDataContext(); <--
}