Я пытаюсь создать пользовательский элемент управления, который представляет то, что я называю рабочей областью (ссылка из блога Джоша Смита). Рабочие области будут отображаться в виде вкладок. Я стремлюсь использовать интерфейс с вкладками для управления различными открытыми документами, как в браузере рабочей книги excal.
Каждый раз, когда пользователь открывает новую рабочую область, она должна отображаться в элементе управления вкладками. Каждая рабочая область принимает форму пользовательского элемента управления, и каждая рабочая область имеет свою собственную модель представления. Я хотел бы, чтобы в заголовке вкладки отображалось свойство из моей модели представления, которое, как мне кажется, должно быть представлено как свойство через мой пользовательский элемент управления.
До сих пор самым чистым решением, которое мне нравилось больше всего, пока я не столкнулся с многочисленными проблемами, было использование таблиц данных. В основном я делал следующее:
<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 привязан к наблюдаемой коллекции (объекта), которая содержит все мои рабочие области.
Это отлично работает, за исключением двух вещей:
Если я открою несколько клиентов, у меня будет открыто несколько рабочих пространств. Из-за повторного использования DataTemplate я теряю состояние, когда переключаюсь с одной вкладки на другую. Так что все, что не связано, потеряет состояние.
Производительность переключения между различными рабочими пространствами (которые используют разные таблицы данных) ужасно медленная.
Итак ... Я нашел предложение от другого пользователя SO добавить пользовательские элементы управления в ObservableCOllection и отказаться от шаблонов данных. что теперь решает одну из проблем потери состояния. однако теперь я столкнулся с двумя оставшимися проблемами:
- Как установить свойство TabItem.Header без использования DataTemplate
- Скорость переключения между вкладками по-прежнему низкая, если они не принадлежат одному и тому же DataTemplate.
Затем я приступил к фактическому добавлению TabItem в ObservableCollection в моем фоновом коде и установил для свойства TabItem.Content значение свойства пользовательского элемента управления. Проблема скорости была устранена, как и проблема потери состояния, поскольку я отказался от использования DataTemplates. Однако сейчас я застрял с проблемой привязки TabItem.header к свойству Custome «Title» моего пользовательского элемента управления, который должен отображаться в заголовке вкладки.
Итак, после этого ужасно длинного поста мои вопросы таковы:
Есть ли способ использовать шаблоны данных и заставить их создавать новый экземпляр для каждого элемента в коллекции, чтобы предотвратить повторное использование и потерю состояния.
1а. Есть ли лучшая альтернатива, чем то, что я упомянул в сообщении выше?
есть ли способ сделать все это с помощью Xaml вместо создания внутреннего кода элементов вкладок?