@saphire13
Системный администратор

Почему некорректно срабатывает триггер?

Доброго дня. Пишу приложение на WPF для работы с БД, столкнулся с неведомым:) Периодически должен обновляться статус сервера MySQL для отображения этого статуса на форме: элемент красного цвета - сервер оффлайн, зеленого цвета - сервер онлайн.
Код элемента:
<Grid Grid.Column="0" Grid.Row="2">
            <Border>
                <Border.Style>
                    <Style>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Path=MySQLServerStatus}" Value="False">
                                <Setter Property="Border.Background" Value="Red"/>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding Path=MySQLServerStatus}" Value="True">
                                <Setter Property="Border.Background" Value="Green"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Border.Style>
            </Border>
        </Grid>

Во ViewModel:
public Boolean MySQLServerStatus { get; set; }
        public MainWindowViewModel()
        {
            MySQLServerStatus = false;
            TimerCallback timeCB = new TimerCallback(CheckServer);
            Timer time = new Timer(timeCB, null, 0, 1000);
        }
        private async void CheckServer(object state)
        {
            bool status = false;
            try
            {
                status = await Task<bool>.Run(() => Data.GetData.CheckServerStatus());
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            finally
            {
                if (status != MySQLServerStatus)
                {
                    MySQLServerStatus = status;
                    OnPropertyChanged("MySQLServerStatus");
                }
            }
        }

Data.GetData.CheckServerStatus()
public static async Task <bool> CheckServerStatus ()
            {
                bool serverStatus = await Task.Run(() =>
                    {
                        var connectionString = @"***********************************";
                        bool result = false;
                        using (MySqlConnection connect = new MySqlConnection())
                        {
                            try
                            {
                                connect.ConnectionString = connectionString;
                                connect.Open();
                                if (connect.State == ConnectionState.Open)
                                {
                                    connect.Close();
                                    result = true;
                                }
                                else
                                {
                                    connect.Close();
                                    result = false;
                                }
                                
                            }
                            catch
                            {
                                result = false;
                            }
                        }
                        return result;
                    });
                return serverStatus;
            }


DataTrigger нормально срабатывает только при запуске приложения: так как в конструкторе класса ViewModel по умолчанию стоит false - то считаем что сервер у нас выключен постоянно. Если я запускаю приложение с включенным сервером MySQL - border как и нужно зеленый. Если я выключаю сервер по ходу выполнения приложения - border.background не обновляется, хотя таймер корректно отрабатывает. Так же border.background корректно отрабатывает если я вешаю изменение MySQLServerStatus на кнопку на форме. У меня есть две мысли - либо писать конвертер и не использовать DataTrigger (может быть дело в нем), либо асинхронный делегат таймера CheckServer(object state) не может повлиять на переменную в основном потоке.
Прошу помощи:)
  • Вопрос задан
  • 482 просмотра
Решения вопроса 1
@tex0
Александр: попробуйте вместо System.Threading.Timer использовать
System.Windows.Threading.DispatcherTimer
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Google
Dependencyproperty
Inotifypropertychanged
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы