簡體   English   中英

保持 MenuItem 的 IsChecked 屬性與布爾值同步

[英]Keep a MenuItem's IsChecked property synced with a bool

我有一個簡單的 WPF 應用程序,頂部有一個菜單。 我想添加一個選項,使主 window 保持在其他 windows 之上。

我在“屬性”>“設置”選項卡中創建了一個名為 setTopMost 的布爾值,供用戶保存此設置。 因此,即使應用程序終止,設置也會被記住。

一切都按預期工作,我可以單擊該選項或使用快捷鍵 Ctrl+T 使 window 保持在頂部,但是當 window 位於其他頂部時,我無法在選項旁邊出現復選標記windows。

我已經閱讀了幾篇關於將 IsChecked 綁定到布爾值的文章,但我自己無法解決這個問題。

這是我的代碼。

主窗口.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>

主窗口.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;
        }
    }

}

請注意,我這樣做是一種愛好,對此很陌生。

您的MenuItem未正確更新的主要原因是您將WindowDataContext設置為PracticeDataContext

public MainWindow()
{
    InitializeComponent();
    DataContext = new PracticeDataContext(); <--
}

這意味着您在MainWindow.xaml中的綁定將在PracticeDataContext中尋找屬性。

在這種情況下,您可能希望在您的PracticeDataContext class 中有一個IsTopMost屬性,以便綁定工作。

由於在Loaded事件處理程序觸發之前不會設置IsTopMost ,因此您應該在PracticeDataContext class 中實現INotifyPropertyChanged ,以便在從設置中設置IsTopMost綁定時收到通知。

INotifyPropertyChanged上快速搜索會顯示很多示例。 這很容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM