Доброго дня. Пишу приложение на 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) не может повлиять на переменную в основном потоке.
Прошу помощи:)