Привязка к ItemsSource TabControl в WPF

Я в безвыходном положении (без каламбура), когда дело касается моих текущих потребностей в связывании в WPF Я провел большую часть дня, пытаясь исследовать свою проблему, и я не могу найти надежного решения своей проблемы. вот:

Я пытаюсь создать пользовательский элемент управления, который представляет то, что я называю рабочим пространством (ссылка из блога Джоша Смита). Рабочие пространства будут отображаться во вкладке. Я стремлюсь использовать интерфейс с вкладками для управления различными документами, которые я открыл, как в браузере исключительной рабочей книги.

Каждый раз, когда пользователь открывает новое рабочее пространство, это рабочее пространство должно отображаться во вкладке. Каждое рабочее пространство принимает форму пользовательского элемента управления, и каждое рабочее пространство имеет свою собственную модель представления. Я хотел бы, чтобы заголовок вкладки отображал свойство из моей модели представления, которое, я думаю, скорее всего, будет отображаться как свойство через мой пользовательский элемент управления.

До сих пор самым чистым решением, которое мне нравилось больше всего, пока я не столкнулся с многочисленными проблемами, было использование таблиц данных. В основном я сделал следующее:

<DataTemplate x:Key="WorkspaceItem">
            <DockPanel Width="120">
                <ContentPresenter 
                    Content="{Binding Title}" 
                    VerticalAlignment="Center" 
                    />
            </DockPanel>
        </DataTemplate>     

<DataTemplate DataType="{x:Type CustomerViewModel}">
   <workspace:CustomerWorkspace />
</DataTemplate>

<TabControl ItemsSource="{Binding Workspaces}" ItemTemplate="{StaticResource WorkspaceItem}"/>

TabControl.ItemsSource связан с наблюдаемой коллекцией (объекта), которая содержит все мои рабочие пространства.

Это прекрасно работает, за исключением 2 вещей:

If I open multiple customers, then I have multiple workspaces open. Because of DataTemplate Recycling, I lose state when i swap from one tab to another. So everything that is not bound will lose state.

The performance of swapping between Different workspaces (that use different datatemplates) is terribly slow.

Итак ... Я нашел предложение от другого пользователя на SO, чтобы добавить пользовательские элементы управления в ObservableCOllection и отказаться от шаблонов данных. это теперь решает одну из проблем потери государства. однако теперь я столкнулся с 2 оставшимися проблемами:

How do i set the TabItem.Header property without using a DataTemplate The speed of swapping back and forth between tabs is still slow unless they are of the same DataTemplate.

Затем я приступил к фактическому добавлению TabItem к ObservableCollection в моем коде и установил свойство TabItem.Content для пользовательского элемента управления. Проблема скорости теперь устранена, так же как и проблема потери состояния, поскольку я прекратил использование шаблонов данных. Однако теперь я застрял с проблемой привязки TabItem.header к Custome & quot; Заголовок & quot; Свойство моего usercontrol, которое должно отображаться в заголовке вкладки.

Итак, после этого ужасно длинного поста, мои вопросы:

Is there any way to use datatemplates and force them to create a new Instance for each item in the collection to prevent recycling and state loss.

1a. Is there a better alternative than what I mentioned in the post above?

is there a way to do all of this through the Xaml instead of through back end code construction of Tab Items?

Ответы на вопрос(1)

Ваш ответ на вопрос