Это короткий вопрос, но требует подробного объяснения. Короче говоря, в нашем WPF-приложении у нас есть Teleriks RadTabbedWindow , который привязан к данным для списка моделей просмотра, и если пользователь нажимает кнопку новой вкладки, мы добавляем новую модель просмотра в источник данных. Каждая ViewModel связана со своим представлением с помощью DataTemplate (см. Ниже), ничего особенного.
В элементах управления (ниже) мы связали Loaded-event (вот так) . Проблема в том, что он срабатывает только на первой вкладке. Допустим, мы создаем 3 SearchHolderViewModels, ie 3 экземпляра одного и того же элемента управления, по одному на каждой вкладке. . Я получаю OnControlLoaded только для первого созданного Control. С помощью приведенного ниже кода я "вручную" вызываю LoadedCommand, и это работает. Но есть ли это путь к этому? И почему мы получаем событие только в первый раз, так как я вижу, что 3 экземпляра не связаны
Мы используем 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;
}
}