1

День добрый.

Проблема следующая: есть 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>
&lt;TabControl.ItemTemplate&gt;
    &lt;DataTemplate DataType=&quot;{x:Type workspace:PropertyWorkspaceViewNodel}&quot;&gt;
        &lt;TextBlock Text=&quot;{Binding HeaderText}&quot; /&gt;
    &lt;/DataTemplate&gt;
&lt;/TabControl.ItemTemplate&gt;

</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&lt;SectionViewModel&gt; {
        //    new NodeSectionViewModel(node)
        //};
    }

    public PropertyWorkspaceViewNodel() { }

    public List&lt;SectionViewModel&gt; 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>
&lt;ItemsControl ItemsSource=&quot;{Binding PropertyControls}&quot;&gt;
    &lt;ItemsControl.ItemTemplate&gt;
        &lt;DataTemplate DataType=&quot;{x:Type s:NodeSectionViewModel}&quot;&gt;
            &lt;sv:NodeSection /&gt;
        &lt;/DataTemplate&gt;
    &lt;/ItemsControl.ItemTemplate&gt;
&lt;/ItemsControl&gt;

XAML SectionViewModel

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

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

  • 1
    Из того, что видно невооруженным взглядом: <UserControl.DataContext> - вы так сбиваете DataContext объекта, дайте свободу, пусть сам его установит, да и вообще, DataContext в View слое это плохо и нарушение MVVM. Далее, всякие public List<SectionViewModel> PropertyControls { get; } - где INPC? У вас пустое, неинициализированное свойство, которому вы скорей всего потом делаете = new..., что в свою очередь порождает другое свойство и UI про него не знает. Ну и на последок, как по мне, такие проблемы надо сопровождать минимальным, самодостаточном примером, чтобы люди могли запустить. – EvgeniyZ May 21 '21 at 22:54
  • @EvgeniyZ PropertyControls тип изменил на ObservableCollection<>, свойство инициализируется в конструкторе WorkspaceViewModel – Undefined May 21 '21 at 23:53
  • @EvgeniyZ Можно Вас попросить пояснений почему <UserControl.DataContext> == плохо? Как я понял второй вариант это в Code-Behind сносить, но у меня ни строчки CB нет, так красиво идёт. Прошу пояснить – Undefined May 21 '21 at 23:56
  • https://ru.stackoverflow.com/a/562586/220553 – EvgeniyZ May 22 '21 at 00:05
  • А где у вас привязка с FindAncestor, не вижу в тексте вопроса. Вообще, на сколько я помню, с TabContol есть нюансы, контент создаётся только для активной вкладки, поэтому привязка не срабатывает на момент ее создания https://ru.stackoverflow.com/a/880724/218063, https://ru.stackoverflow.com/a/943427/218063 – Андрей NOP May 22 '21 at 05:07
  • Какую задачу вы решаете? Что делает приложение? Как это запустить, потестировать? – aepot May 22 '21 at 09:00

0 Answers0