来自 TabItem 中服务的 ItemsSource 仅在第二次选择此选项卡时加载

ItemsSource from a service in a TabItem only loaded when this tab is selected a second time

我有一个包含对象列表的服务。

我有一个带有 属性 的 ViewModel 正在引用此列表:

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

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

此 ViewModel 用于名为 MyView 的视图,它显示在 TabItem 中,它本身在 TabControl 中,none 其中是程序的第一个视图。 MyView 包含一个 ComboBox,其 ItemsSource 绑定到 MyList。

程序启动时,myService.TheList为空。稍后,它被加载。从那时起,进入显示 MyView 的选项卡会显示一个空的 ComboBox。但是切换 TabItem 并返回最终会触发 OnPropertyChanged,并填充 ComboBox。

为什么仅在第二次显示视图时才触发 OnPropertyChanged?

如果您的服务延迟加载(或至少在稍后阶段),您应该在您的服务上实现事件以通知侦听器数据已可用。那么你应该在你的视图模型上做这样的事情。

请注意,此实现还可以防止内存泄漏(因为它同时处理服务的订阅和取消订阅),很多人在实现视图模型时忘记了这一点。

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