2015-03-19 3 views
0

У меня есть следующее TabControl в моем XAML, где я пытаюсь получить заголовки вкладок, чтобы показать свойство Name моего класса Sequence. Моя ViewModel возвращает ObservableCollection<Sequence>. Но по какой-то причине я получаю вместо этого «Sequencer.Common.SequenceDocument.Sequence» вместо заголовка.Получение имени класса вместо значения свойства в привязке XAML с TabControl

Класс Sequence имеет свойство Name, и я знаю, что оно возвращает собственное имя, но я что-то упустил в связи с заменой ItemHeader?

<dx:DXTabControl x:Name="TabControl" 
       ItemsSource="{Binding Sequences}" 
       SelectionChanged="TabControl_OnSelectionChanged"> 
    <dx:DXTabControl.View> 
     <dx:TabControlMultiLineView HeaderLocation="Bottom"/> 
    </dx:DXTabControl.View> 
    <dx:DXTabControl.ItemContainerStyle> 
     <Style TargetType="dx:DXTabItem"> 
      <Setter Property="Header" Value="{Binding Name}"/> 
     </Style> 
    </dx:DXTabControl.ItemContainerStyle> 

    <!--Content--> 
    <dx:DXTabControl.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <views:DxTaskList x:Name="Tasklst" /> 
      </Grid> 
     </DataTemplate> 
    </dx:DXTabControl.ItemTemplate>          
</dx:DXTabControl> 
+0

Для цели отладки вы можете добавить конвертер в привязку «Значение» и проверить, откуда берется значение «Имя». Что-нибудь еще здесь будет гадать. Что это за DXTabControl? Твой собственный? Библиотека вечеринок Thrid? – Herdo

+0

Это сторонняя библиотека (DevExpress) – Ray

ответ

0

Вы используете ItemContainerStyle, который используется для установки стиля для каждого элемента списка.

Вы должны определить шаблон для этого и ваши привязки должны выглядеть

<!--Content--> 
<dx:DXTabControl.ItemTemplate> 
    <DataTemplate> 
     <Grid> 
      <TextBlock Text="{Binding Name}"/> 
      <views:DxTaskList x:Name="Tasklst" /> 
     </Grid> 
    </DataTemplate> 
</dx:DXTabControl.ItemTemplate>  

значение сеттер собственности в стиле не может быть переплетены.

Но привязка Имя к текстовому блоку определенно даст вам все имя в классе Последовательности, содержащемся в последовательностях Collection.

+0

Это, похоже, все-таки помогло мне переопределить метод ToString() моего класса Sequence, чтобы он вернул имя. – Ray

0

Вы можете попробовать Sequences.Name (или что-то название вашей собственности) в вашем ItemsSource?

Так он выглядит:

<dx:DXTabControl x:Name="TabControl" 
ItemsSource="{Binding Sequences.Name}" 
SelectionChanged="TabControl_OnSelectionChanged"> 

Подозреваю, что вы связываете с самого класса, который является «Sequencer.Common.SequenceDocument.Sequence», (так же, как, как если бы вы сделали последовательности. toString()), и он вернет само имя объекта.

Связывание должно быть связано с собственностью, вот хороший учебник по binding stuff, вы можете посмотреть в разделе «Синтаксис пути свойства».

1

Вы устанавливаете ItemContainerStyle, который, в соответствии с DevExpress documentation:

стиль применяется к элементу контейнера, сформированного для каждой вкладки элемента

Но что вы хотите достичь, является , чтобы получить заголовки вкладок, чтобы показать свойство Name моего класса Sequence.

Для того, чтобы завершить этот, вам необходимо установить ItemHeaderTemplate свойство DXTabControl:

<dx:DXTabControl> 
    <dx:DXTabControl.ItemHeaderTemplate> 
     <TextBlock Text="{Binding Name}"/> 
    </dx:DXTabControl.ItemHeaderTemplate> 
</dx:DXTabControl> 

Но почему ваше имя класса отображаться в заголовке?

Поскольку вы не указали шаблон заголовка для элементов табуляции, элемент управления использовал представление ToString()/string вашего класса. Обычно представление строки представляет собой полное имя класса. И из-за этого вы видите имя класса, а не свойство Name.

Перегрузка метода ToString также поможет решить вашу проблему, но это не настоящее решение.