Видимо Игнорирование Выходных данных конвертера видимости - PullRequest
0 голосов
/ 03 июля 2018

Я несколько новичок в приложениях WPF, но, похоже, что такая простая вещь идет не так, что я в тупике. Я пытался найти ответ, но большинство из того, что я нахожу, - это ошибки Binding, которых здесь нет.

По сути, у меня есть приложение WPF для доступа к базе данных для отображения элементов пользователю. Указанные данные хранятся в виде таблицы в представлении, видимость которого определяется логическим свойством (RecordLoaded), которое реализует OnPropertyChanged, и стандартным конвертером BoolToVisibility.

DataView.xaml:

<Grid  Visibility="{Binding RecordLoaded, Converter={StaticResource BoolToVisibility}}">

Когда элемент в древовидном представлении выбран, класс SelectedRecord обновляется, что затем, в свою очередь, запускает событие (OnRecordSelected), чтобы установить для RecordLoaded значение false и вызывать функцию (FillDetails) для получения соответствующих данных.

private void DataSelectedRecord_OnRecordSelected(object sender, EventArgs e)
    {
        RecordLoaded = false;
        FillDetails();

    }

После того, как все данные были получены из базы данных, в конце FillDetails для RecordLoaded устанавливается значение true.

Проблема в том, что я пытаюсь реализовать небольшое «мерцание», чтобы показать, что представление обновлено путем включения и выключения видимости сетки, особенно при работе с данными, имеющими минимальные различия между двумя записями. , Но хотя я могу переместить сетку из исходного состояния Visibility.Hidden в Visible, используя конвертер, и конвертер работает корректно, возвращая правильные значения Hidden или Visible, а также когда логическое значение установлено в false и true, абсолютно нет изменить с визуальной стороны вещи, даже не мерцание.

Моей первой мыслью было то, что состояния быстро возвращались к истине, и это быстро было невозможно обнаружить, но я добавил задержку в метод FillDetails незадолго до логического значения без радости.

Есть ли у кого-нибудь какие-либо предложения относительно того, что может идти не так, или, возможно, даже альтернативные способы обозначения обновления данных (без навязчивого сообщения или иным образом)?

1 Ответ

0 голосов
/ 03 июля 2018

Все происходит синхронно в потоке пользовательского интерфейса, поэтому пользовательский интерфейс не имеет возможности его обновить. Вы можете объявить обработчик событий асинхронным, запустить FillDetails в Задаче и дождаться его:

private async void DataSelectedRecord_OnRecordSelected(object sender, EventArgs e)
{
    RecordLoaded = false;
    await Task.Run(() => FillDetails());
    RecordLoaded = true;
}

Обратите внимание, однако, что когда FillDetails обращается к элементам пользовательского интерфейса или данным, с которыми связаны элементы пользовательского интерфейса, может потребоваться сделать это внутри вызова Dispatcher.Invoke или BeginInvoke.


Если API базы данных разрешает асинхронный доступ, возможно, вы также можете объявить FillDetails асинхронным и ожидать асинхронных вызовов API. Тогда вам не понадобится Task.Run:

private async void DataSelectedRecord_OnRecordSelected(object sender, EventArgs e)
{
    RecordLoaded = false;
    await FillDetails();
    RecordLoaded = true;
}

private async Task FillDetails()
{
    var queryResults = await someDbApiCallAsync();
    // do something with it
}
...