保持MenuItem的IsChecked属性与布尔同步

时间:2019-10-31 17:30:10

标签: c# wpf data-binding

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

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

一切正常,我可以单击选项或使用Ctrl + T的快捷方式使窗口停留在顶部,但是当窗口打开时我无法在选项旁边显示复选标记其他窗口的顶部。

我已经阅读了几篇有关将IsChecked绑定到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>

MainWindow.xaml.cs

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

}

请注意,这是我的业余爱好,对此还很陌生。

1 个答案:

答案 0 :(得分:1)

MenuItem无法正确更新的主要原因是因为您将DataContext的{​​{1}}设置为Window

PracticeDataContext

这意味着您在public MainWindow() { InitializeComponent(); DataContext = new PracticeDataContext(); <-- } 中的绑定将在MainWindow.xaml中寻找属性。

在这种情况下,您希望在PracticeDataContext类中拥有一个IsTopMost属性,以便使绑定起作用。

由于在PracticeDataContext事件处理程序启动之前未设置IsTopMost,因此应在Loaded类中实现INotifyPropertyChanged,以便将PracticeDataContext绑定通过设置进行设置时会收到通知。

IsTopMost上进行快速搜索将显示许多示例。很简单。