TabControls и MVVM: Многоуровневое связывания DataContext и ItemsSource

День добрый.

Проблема следующая: есть TabContol, где

Workspaces is ObservableCollection (из XAML WinMainViewModel)

<TabControl Grid.Column="1" Grid.Row="0"
            ItemsSource="{Binding Workspaces}">
    <TabControl.ContentTemplate>
        <DataTemplate DataType="{x:Type workspace:PropertyWorkspaceViewNodel}">
            <vw:PropertyWorkspace />
        </DataTemplate>
    </TabControl.ContentTemplate>
                
    <TabControl.ItemTemplate>
        <DataTemplate DataType="{x:Type workspace:PropertyWorkspaceViewNodel}">
            <TextBlock Text="{Binding HeaderText}" />
        </DataTemplate>
    </TabControl.ItemTemplate>
</TabControl>

Коллекция Workspaces определяется, когда меняется выделенный элемент TreeView

public NodeViewModel SelectedNode {
    get => _SelectedNode;
    set {
        this.SetProperty(ref _SelectedNode, value);
        Workspaces = new ObservableCollection<WorkspaceViewModel> {
            new PropertyWorkspaceViewNodel(value)
        };
    }
}

В зависимости от того, какой value (т.е. производный класс от NodeViewModel) придёт в мутатор SelectedNode.set определится количество и тип моделей производных от WorkspaceViewModel

Я выбираю - всё работает, значение в HeaderText сливается

    internal sealed class PropertyWorkspaceViewNodel : WorkspaceViewModel
    {
        public PropertyWorkspaceViewNodel(NodeViewModel node)
        {
            HeaderText = "Свойства " + node.Disp;

            //PropertyControls = new List<SectionViewModel> {
            //    new NodeSectionViewModel(node)
            //};
        }

        public PropertyWorkspaceViewNodel() { }

        public List<SectionViewModel> PropertyControls { get; }
    }

введите сюда описание изображения

ПРОБЛЕМА 1: переключаюсь с узлов TreeView и (через раз!) TabItem выделяется (активный, как будто по вкладке нажал пользователь) И через раз падает ошибка >>

  1. Серьезность: Ошибка
  2. Число: 12 (когда она возникает, то +4 сразу)
  3. Контекст данных: null
  4. Путь привязки: TabStripPlacement
  5. Целевой объект: TabItem.NoTarget
  6. Конечный тип: Object
  7. Описание: Не удается найти источник: RelativeSource FindAncestor, AncestorType='System.Windows.Controls.TabControl', AncestorLevel='1'.

ПРОБЛЕМА 2: не могу по такой же логике внутрь Шаблона Контента TabItem Привязать реализацию секций

ViewModel Workspace имеет ЕЩЁ коллекцию ViewModel секций

ObservableCollection<SectionViewModel> PropertyControls

Тут он видит и связывает, а при запуске ПУСТО. Руки опускаются... введите сюда описание изображения

XAML WorkspaceView

    <UserControl.DataContext>
        <w:PropertyWorkspaceViewNodel />
    </UserControl.DataContext>

    <ItemsControl ItemsSource="{Binding PropertyControls}">
        <ItemsControl.ItemTemplate>
            <DataTemplate DataType="{x:Type s:NodeSectionViewModel}">
                <sv:NodeSection />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

XAML SectionViewModel

   <UserControl.DataContext>
        <s:NodeSectionViewModel />
    </UserControl.DataContext>
    
    <StackPanel Background="White">
        <TextBlock Text="{Binding Header}" Padding="10" FontSize="14pt" Foreground="White" Background="Black" />
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="auto" />
                <RowDefinition Height="auto" />
            </Grid.RowDefinitions>
            <TextBlock Text="Системное имя" Grid.Column="0" Grid.Row="0" />
            <TextBlock Text="{Binding Disp}" Grid.Column="1" Grid.Row="0" />
            <TextBlock Text="Имя" Grid.Column="0" Grid.Row="1" />
            <TextBlock Text="{Binding Disp}" Grid.Column="1" Grid.Row="1" />
        </Grid>
    </StackPanel>

Прошу помощи! Заранее спасибо! Оставлю тут ссылки: Discord: ! Красный Рыцарь#9927 Telegram: @PHXHKR


Ответы (0 шт):