我有一个包含对象列表的服务。
我有一个ViewModel,其属性引用了这个List:
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仅在第二次显示视图时触发?
答案 0 :(得分: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);
}