2010-08-15 2 views
8

В следующем примере xaml каждый элемент табуляции имеет общий доступ к тому же TextBox. Это имеет смысл, на каком-то уровне, я думаю ... но это неожиданное поведение и почти похоже на ошибку. И я не мог найти никакой информации в документах, объясняющих поведение, или как правильно обойти это.TabItems TabControl, разделяющий один и тот же контент ... Не хочу

<TabControl> 
    <TabControl.Resources> 
     <Style TargetType="TabItem"> 
      <Setter Property="ContentTemplate"> 
       <Setter.Value> 
        <DataTemplate> 
         <TextBox /> 
        </DataTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </TabControl.Resources> 
    <TabItem Name="tab1" /> 
    <TabItem Name="tab2" /> 
</TabControl> 

При переключении между tab1 и tab2, то же TextBox используется, когда я бы ожидать нового TextBox для каждой вкладки. Как я могу получить последний случай?

Подклассификация TabItem и создание его содержимого TextBox по умолчанию является одним из способов сделать это, но я просто хочу быть уверенным, что нет чего-то, что мне не хватает.

Редактировать

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

Возможно, с текущей реализацией TabControl не существует декларативного подхода к решению этого вопроса. Это довольно тривиальная настройка содержимого в коде, но в WPF такие вещи всегда ошибочны. Для меня это кажется необоснованной оптимизацией TabControl; он должен по крайней мере быть факультативным для ситуаций, когда это нецелесообразно.

+0

Какова ваша цель? Я уверен, что мы можем найти решение вашей проблемы по-другому, как только мы это узнаем =) – hkon

+2

У меня нет хорошего решения для этой проблемы, но меня действительно интересуют ответы, которые могут возникнуть. .. Это поведение - настоящая боль. Иногда имеет смысл, что шаблон контента разделяется между вкладками, но очень часто это не так, как правило, когда вы создаете интерфейс с вкладками –

+0

@hkon: я хочу, чтобы каждая вкладка имела свой собственный контент, как он определен в шаблоне обмена одним экземпляром между вкладками. Связывание данных работает при сохранении привязанных данных в синхронизации между вкладками, но это может вызвать некоторые проблемы. Возможно, пользователь набрал полосу прокрутки на одной вкладке, и ее положение затем забывается после перехода на нее. – Siege

ответ

4

Я подозреваю, что есть лучше способ достичь то, что вы пытаетесь достичь, но я думаю, что это будет работать (будет проверить, но я на Linux атм):

<TabControl> 
    <TabControl.Resources> 
     <Style TargetType="TabItem" x:Shared="False"> 
      <Setter Property="ContentTemplate"> 
       <Setter.Value> 
        <DataTemplate> 
         <TextBox /> 
        </DataTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </TabControl.Resources> 
    <TabItem Name="tab1" /> 
    <TabItem Name="tab2" /> 
</TabControl> 
+1

Ах, это выглядело многообещающим ... к сожалению, каждый раз, когда выбирается вкладка, ее старый контент перезаписывается новым пустым TextBox. – Siege

+0

+1 в любом случае, чтобы сообщить мне об атрибуте «Общий»: P – Siege

0

Он будет работать если вы определяете usercontrol, в котором есть содержимое вкладки. Я создал следующий UserControl:

<UserControl x:Class="SO_Testing.TextBoxUC" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <Grid> 
     <TextBox/> 
    </Grid> 
</UserControl> 

Тогда я изменил свое окно XAML быть это:

<Window x:Class="SO_Testing.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:SO_Testing" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <TabControl> 
      <TabItem Name="tab1" Header="Test"> 
       <local:TextBoxUC/> 
      </TabItem> 
      <TabItem Name="tab2" Header="Test 2"> 
       <local:TextBoxUC/> 
      </TabItem> 
     </TabControl> 
    </Grid> 
</Window> 

Это не может быть именно то, что вы хотели, но, по крайней мере, расположение каждой вкладки только определенный в одном месте, и затем вы можете назначить datacontext для каждого пользовательского контроля, чтобы показывать значения для каждой из ваших вкладок.

+0

Это не решает проблему, которую я иллюстрировал. Пользователь UserControl здесь также бессмыслен, потому что если вы специально настроили контент, как вы здесь, он будет работать с простым старым TextBox; проблема заключается в том, что шаблон контента вызывает совместное использование контента среди вкладок, содержимое которых не задано явно. Однако я попытался использовать UserControl в шаблоне, чтобы увидеть, будет ли это иметь какое-либо значение, но, как и ожидалось, этого не произошло. Я обновил свой вопрос, чтобы быть более ясным. – Siege

Смежные вопросы