ItemsSource из сервиса в TabItem загружается только при повторном выборе этой вкладки

У меня есть сервис, который содержит список объектов.

У меня есть ViewModel со свойством, которое ссылается на этот список:

public MyViewModel(IMyService myService)
{
    MyList = myService.TheList;
}

public List<Object> MyList { get { return GetValue...etc

Эта ViewModel предназначена для представления с именем MyView, которое отображается в TabItem, само в TabControl, ни одно из которых не является первым представлением программы. MyView содержит ComboBox с его ItemsSource, связанным с MyList.

Когда программа запущена, myService.TheList нулевой. Позже он загружается. С этого момента, переход на вкладку с отображением MyView показывает пустой ComboBox. Но переключение TabItem и возврат в конечном итоге запускает OnPropertyChanged, и ComboBox заполняется.

Почему OnPropertyChanged срабатывает только при втором отображении представления?

1 ответ

Решение

Если ваш сервис загружается из памяти (или, по крайней мере, на более позднем этапе), вы должны реализовать в своем сервисе события, чтобы информировать слушателей о том, что данные стали доступны. Затем вы должны сделать что-то подобное на вашей модели представления.

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

private readonly IMyService _myService;

public MyViewModel(IMyService myService)
{
    Argument.IsNotNull(() => myService);

    _myService = myService;
}

public List<Object> MyList { get; private set; }

protected virtual async Task InitialyzeAsync()
{
    _myService.ReceivedData += OnMyServiceReceivedData;

    UpdateData();
}

protected virtual async Task CloseAsync()
{
    _myService.ReceivedData -= OnMyServiceReceivedData;
}

private void OnMyServiceReceivedData(object sender, EventArgs e)
{
    UpdateData();
}

private void UpdateData()
{
    MyList = new List<Object>(myService.TheList);
}
Другие вопросы по тегам