Поддерживайте синхронизацию свойства IsChecked объекта MenuItem с bool - PullRequest
0 голосов
/ 31 октября 2019

У меня есть простое приложение WPF с меню сверху. Я хочу добавить параметр, чтобы главное окно оставалось поверх других окон.

Я создал bool с именем 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 голосов
/ 31 октября 2019

Основная причина, по которой ваш MenuItem не обновляется должным образом, заключается в том, что вы установили DataContext для Window на PracticeDataContext.

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

Это означает, что ваши привязки в MainWindow.xaml будет искать свойства в PracticeDataContext.

. В этом случае вы захотите иметь свойство IsTopMost в вашем классе PracticeDataContext, чтобы привязка работала.

Поскольку IsTopMost не устанавливается до тех пор, пока не сработает обработчик события Loaded, вы должны реализовать INotifyPropertyChanged в своем классе PracticeDataContext, чтобы привязка IsTopMost получала уведомление, когда она установлена ​​из настроек.

Быстрый поиск по INotifyPropertyChanged покажет вам множество примеров. Это довольно просто.

...