C# 使MenuItem的IsChecked属性与布尔同步

C# 使MenuItem的IsChecked属性与布尔同步,c#,wpf,data-binding,C#,Wpf,Data Binding,我有一个简单的WPF应用程序,上面有一个菜单。我想添加一个选项,使主窗口保持在其他窗口的顶部 我在属性>设置选项卡中创建了一个名为setTopMost的bool,供用户保存此设置。因此,即使在应用程序终止后,该设置也会被记住 一切正常,我可以单击该选项或使用快捷键Ctrl+T使窗口保持在顶部,但当窗口位于其他窗口顶部时,我无法在该选项旁边显示复选标记 我读过几篇关于绑定IsChecked to a bool的文章,但我自己无法解决这个问题 这是我的密码 MainWindow.xaml <W

我有一个简单的WPF应用程序,上面有一个菜单。我想添加一个选项,使主窗口保持在其他窗口的顶部

我在属性>设置选项卡中创建了一个名为setTopMost的bool,供用户保存此设置。因此,即使在应用程序终止后,该设置也会被记住

一切正常,我可以单击该选项或使用快捷键Ctrl+T使窗口保持在顶部,但当窗口位于其他窗口顶部时,我无法在该选项旁边显示复选标记

我读过几篇关于绑定IsChecked to a bool的文章,但我自己无法解决这个问题

这是我的密码

MainWindow.xaml

<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(); <--
}