Мой код 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);
}
}
Добавлен снимок ViewModel
Я не вижу свойство IsConnected, к которому привязан флажок. Можете ли вы включить это в код виртуальной машины?
Извините, плохое редактирование. Показывает сейчас.
Я думаю, вам нужно будет реализовать INotifyPropertyChanged и запустить событие PropertyChanged, чтобы эти изменения в виртуальной машине отражались в графическом интерфейсе.
Я не опубликовал полный код, так как он слишком большой. Код основан на MVVM Light, а ViewModel получен из ViewModelBase.
Я столкнулся с той же проблемой и нашел простое решение:
Поскольку мы привязываем команду к реакции, когда пользователь нажимает Togglebutton
в этом сценарии, у нас есть все, что нам нужно. Просто создайте событие PropertyChanged
для свойства, привязанного к IsChecked
. В вашем случае вы должны поднять событие для Isconnected
, и это будет первое, что нужно сделать в вашем ConnectMethod
. Это гарантирует, что Togglebutton
останется в состоянии, пока свойство действительно не изменится.
Объяснение:
Это работает, потому что изменение вносится только в визуальное состояние, а базовое свойство не изменяется, как ожидалось для OneWay
Binding. Таким образом, свойство по-прежнему имеет неизменное значение, и при возникновении события PropertyChanged
событие Togglebutton
вынуждено синхронизировать свое визуальное состояние со значением свойства и сохранять его состояние. Когда свойство действительно изменяется, событие PropertyChanged
автоматически возникает снова, и Togglebutton
может, наконец, изменить свое состояние по желанию.
Надеюсь, этот ответ поможет другим столкнуться с этой проблемой и найти решение.
Как выглядит ваша модель представления?