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);
}