0

Объявляю свойства

    public static bool isOnline = false;
    public static BindingList<Request> OnlineRequests { get; set; } = new BindingList<Request>();
public static BindingList&lt;Request&gt; CachedRequests { get; set; } = new BindingList&lt;Request&gt;();

public static BindingList&lt;Request&gt; Requests { get
    {
        if (isOnline)
        {
            return OnlineRequests;
        }
        else
        {
            return CachedRequests;
        }
    } set
    {
        if (isOnline) 
        {
            OnlineRequests = value;
        }
        else
        {
            CachedRequests = value;
        }
    } }

Потом в Main

        gridRequest.DataSource = Config.Requests;
        Requests.ListChanged += requests_ListChanged;

DataSource мгновенно не изменяется при изменении переменной isOnline (требуется повторная привязка). Event ListChanged не срабатывает никогда

Вопрос. Возможно ли как-то синхронизировать всю логику, обращаясь исключительно к Requests

RottenRat
  • 1,200
  • 2
  • 10
  • 1
    Привязали свойство, которое постоянно меняете в коде - вызывайте у него INotifyPropertyChanged, которое оповестит привязки о том, что оно обновилось. – EvgeniyZ Jun 07 '23 at 12:40
  • Немного недопонял вариант Ваш – RottenRat Jun 07 '23 at 12:49
  • Сейчас я решил реализовать другой вариант.

    private void requests_ListChanged(object sender, ListChangedEventArgs e) { if (!Requests.RaiseListChangedEvents) return; ....

    Грубая привязка обоих Event ListChanged к этому методу и проверка, срабатывает ли Event в основной Requests

    – RottenRat Jun 07 '23 at 12:50
  • Ну, начнем с того, что статика зло, ее быть не должно. Далее, почему Requests это свойство, а не метод? Если у вас там еще и асинхронные задачи, где вы кэщируете серверные данные, то вообще это должно быть ValueTask. Ну и последнее, если gridRequest.DataSource - это UI контрол, то сделайте к нему правильную привязку (зависит от типа проекта), а свойства обновляйте через INotifyPropertyChanged (в интернете полно реализаций и примеров), тогда вам не нужны будут события и что либо еще. – EvgeniyZ Jun 07 '23 at 13:03
  • Использую статику исключительно потому что делаю рефакторинг. Слишком много переписывать, если делать все "правильно". Про остальное почитаю, спасибо – RottenRat Jun 07 '23 at 13:26
  • см. ссылку на дубликат. Вам нужно свойство public BindingList<Request> Requests => IsOnline? OnlineRequests : CachedRequests; (никаких static быть не должно!) далее при изменении свойства IsOnline в сеттере вызвать OnPropertyChanged(nameof(Requests)). – aepot Jun 07 '23 at 15:22

1 Answers1

-1

Не углубляясь далеко, можно сказать, что изменение данных работает в одном направлении: Элемент управления для отображения и изменения данных (например, DataGridView) --> BindingList (или BindingSource) --> источник данных. Можно, конечно, плыть против течения, сильно гребя руками, а можно работать с BindingList.

rotabor
  • 4,251