这是一个很短的问题,但需要一个很长的解释。简而言之,在我们的WPF应用程序中,我们有一个叫做 Teleriks RadTabbedWindow(标签式窗口)如果用户点击new-tab-button,我们就会在数据源中添加一个新的ViewModel,每个ViewModel都和它的视图相连,有DataTemplate(见下文),没什么特别的。每个ViewModel都与它的视图相连,用DataTemplate(见下文),没什么特别的。
在控件中(如下图),我们绑定了Loaded-event。(这样) . 问题是它只在第一个Tab页上启动。假设我们创建了3个SearchHolderViewModels,即同一个控件的3个实例,每个Tab中一个。. 我只在第一个创建的控件上得到一个OnControlLoaded。用下面的代码,我 "手动 "触发LoadedCommand,然后就可以了。但这是解决问题的方法吗?为什么我们只在第一次得到事件,因为我认为这三个实例是不相关的。
我们使用的是 Teleriks RadTabbedWindow(标签式窗口),像这样,标记为MainWindow。
<telerik:RadTabbedWindow x:Class="Porter.Application.Views.MainWindow"
...
ItemsSource="{Binding WindowTabs}"
SelectedItem="{Binding SelectedWindowTab, Mode=TwoWay}">
<telerik:RadTabbedWindow.Resources>
<DataTemplate DataType="{x:Type acc:SearchHolderViewModel}">
<acc:SearchHolderView/>
</DataTemplate>
<DataTemplate DataType="{x:Type hello:HelloWorldViewModel}">
<hello:HelloWorldView/>
</DataTemplate>
</telerik:RadTabbedWindow.Resources>
在ViewModel中,属性
private ObservableCollection<ITabbedWindowContent> _windowTabs;
public ObservableCollection<ITabbedWindowContent> WindowTabs
{
get => _windowTabs;
set { SetProperty(ref _windowTabs, value); }
}
private ITabbedWindowContent _selectedWindowTab;
public ITabbedWindowContent SelectedWindowTab
{
get => _selectedWindowTab;
set { SetProperty(ref _selectedWindowTab, value); }
}
ViewModel、ctor和OnTab-added-handler。
public MainWindowViewModel()
{
NewTabWindowCommand = new DelegateCommand<string>(OnNewTabWindow);
WindowTabs = new ObservableCollection<ITabbedWindowContent>() { new SearchHolderViewModel() };
}
private void OnNewTabWindow(string viewName)
{
switch (viewName)
{
case Navigation.RB_SearchAccountsView:
var searachHolderVM = new SearchHolderViewModel(_eventAggregator);
WindowTabs.Add(searachHolderVM);
searchHolderVM.LoadedCommand.Execute();//added to simulate Loaded-event
break;
case Navigation.SA_HelloWorldView:
WindowTabs.Add(new HelloWorldViewModel());
break;
}
}