来自 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);
}
我有一个包含对象列表的服务。
我有一个带有 属性 的 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);
}