Кнопка переключения C# MVVM IsChecked привязка

Мой код MVVM требует подключения кнопки переключения WPF к ViewModel.

Требование состоит в том, чтобы при нажатии кнопки Toggle выполнялась связанная команда, изменяющая свойство IsConnected (bool). Это свойство должно определять визуальное состояние кнопки-переключателя.

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

Как я могу избежать этого состояния гонки или предотвратить срабатывание события Checked?

Код XAML:

<ToggleButton Name = "btnConnect"
              DataContext = "{Binding someViewModel, Source = {StaticResource Locator}}"
              IsChecked = "{Binding Path=IsConnected, Mode=OneWay}"
              Command = "{Binding ConnectCommand}">        
    
</ToggleButton>

Снимок ViewModel:

    public someViewModel()
    {
        Task.Factory.StartNew(() => Initialize());
    }

    public bool IsConnected
    {
        get
        {
            return m_bConnected;
        }
        set
        {
            Set<bool>(() => this.Connected, ref m_bConnected, value);
        }
    } 

    private void Initialize()
    {
        // Init Motion controller connection
        ConnectCommand = new RelayCommand(ConnectMethod);
    }

    public RelayCommand ConnectCommand
    {
        get;
        private set;
    }

    public void ConnectMethod()
    {
        try
        {
            // When in simulation mode
            //m_API.OpenCommSimulator();
            m_API.OpenCommEthernet("192.168.0.139", 731);
            if (m_API.IsConnected)
                Connected = true;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "CONNECTION ERROR", MessageBoxButton.OK, MessageBoxImage.Error);
            System.Diagnostics.Debug.WriteLine(ex.Message);
        }
    }

Как выглядит ваша модель представления?

Pavel Anikhouski 23.12.2020 10:17

Добавлен снимок ViewModel

Mandeep Singh 23.12.2020 10:35

Я не вижу свойство IsConnected, к которому привязан флажок. Можете ли вы включить это в код виртуальной машины?

ekke 23.12.2020 12:04

Извините, плохое редактирование. Показывает сейчас.

Mandeep Singh 23.12.2020 12:18

Я думаю, вам нужно будет реализовать INotifyPropertyChanged и запустить событие PropertyChanged, чтобы эти изменения в виртуальной машине отражались в графическом интерфейсе.

ekke 23.12.2020 13:01

Я не опубликовал полный код, так как он слишком большой. Код основан на MVVM Light, а ViewModel получен из ViewModelBase.

Mandeep Singh 23.12.2020 13:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
858
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я столкнулся с той же проблемой и нашел простое решение:

Поскольку мы привязываем команду к реакции, когда пользователь нажимает Togglebutton в этом сценарии, у нас есть все, что нам нужно. Просто создайте событие PropertyChanged для свойства, привязанного к IsChecked. В вашем случае вы должны поднять событие для Isconnected, и это будет первое, что нужно сделать в вашем ConnectMethod. Это гарантирует, что Togglebutton останется в состоянии, пока свойство действительно не изменится.

Объяснение: Это работает, потому что изменение вносится только в визуальное состояние, а базовое свойство не изменяется, как ожидалось для OneWay Binding. Таким образом, свойство по-прежнему имеет неизменное значение, и при возникновении события PropertyChanged событие Togglebutton вынуждено синхронизировать свое визуальное состояние со значением свойства и сохранять его состояние. Когда свойство действительно изменяется, событие PropertyChanged автоматически возникает снова, и Togglebutton может, наконец, изменить свое состояние по желанию.

Надеюсь, этот ответ поможет другим столкнуться с этой проблемой и найти решение.

Другие вопросы по теме