День добрый. Проблема следующая. Пытаюсь прицепить поле объекта класса, унаследованного от UserControl к DataTemplate TabItem`a. Ничего не получается. При этом если класс не унаследован от Control`a, то биндится все нормально и отображается то, что нужно. К контролам биндинг осуществляется по собому чтоли?
Здравствуйте, MxMsk, Вы писали:
MM>Здравствуйте, Аноним, Вы писали:
А>>День добрый. Проблема следующая. Пытаюсь прицепить поле объекта класса, унаследованного от UserControl к DataTemplate TabItem`a. Ничего не получается. При этом если класс не унаследован от Control`a, то биндится все нормально и отображается то, что нужно. К контролам биндинг осуществляется по собому чтоли?
MM>Нет, ничего особенного. Давай поглядим, как ты привязываешь поле?
Вот определение шаблона (жирным выделена злосчастная привязка):
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate DataType="{x:Type dock:DockumentPanel}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0"
Name="ItemHeader"
Margin="0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Text="{Binding Path=Header}">
<TextBlock.Foreground>
<Binding Path="Foreground">
<Binding.RelativeSource>
<RelativeSource Mode="FindAncestor" AncestorType="{x:Type TabItem}"/>
</Binding.RelativeSource>
</Binding>
</TextBlock.Foreground>
</TextBlock>
<Button Grid.Column="1"
Name="CloseButton"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Width="16"
Height="16"
Focusable="False">
</Button>
</Grid>
</DataTemplate>
</Setter.Value>
</Setter>
Header — свойство зависимости класса DockumentPanel.
А вот добавление элементов, к которым осуществляется привязка:
this.m_lstDockPanels.AddRange(new DockumentPanel[]{
new DockumentPanel(){Header="Item12"},
new DockumentPanel(){Header="Item23"},
new DockumentPanel(){Header="Item34"},
});
this.m_tabDocuments.ItemsSource = this.m_lstDockPanels;
Здравствуйте, Аноним, Вы писали:
А>Вот определение шаблона (жирным выделена злосчастная привязка):
Здесь сыграла роль специфика реализации TabControl-а и TabItem-а. Дело в том, что у них немного другая модель шаблонов. ItemTemplate у TabControl-а задает шаблон для заголовка TabItem-а. Поэтому то, что лежит в шаблоне по умолчанию привязывается к заголовку TabItem-а (его свойству Header), а не к содержимому (которое помещается в сам TabControl при выборе вкладки). Т.к. у тебя Header для TabItem-а не задан, то TextBlock-у не к чему привязываться. Но мы знаем, что DockumentPanel лежит в DataContext самого TabItem-а, а потому такая привязка должна сработать как надо:
Text="{Binding Path=DataContext.Header,RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}"
Или переназначить контекст всего шаблона на DataContext вкладки:
<DataTemplate DataType="{x:Type dock:DockumentPanel}">
<Grid DataContext="{Binding Path=DataContext,RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}">
...
А еще можно связать заголовок TabItem-а с заголовком DockumentPanel через ItemContainerStyle:
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="{x:Type TabItem}">
<Setter Property="Header"
Value="{Binding Path=Header}"/>
</Style>
</Setter.Value>
</Setter>
и тогда достаточно привязать текст через
Text="{Binding}"
Как-то так
Здравствуйте, MxMsk, Вы писали:
MM>Как-то так
Помогло, спасибо.