只有在第二次选中此选项卡时才会加载TabItem中服务的ItemsSource

时间:2016-04-06 13:09:46

标签: wpf mvvm service tabcontrol catel

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

我有一个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仅在第二次显示视图时触发?

1 个答案:

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