WPF DataTemplate к UserControl
От: Аноним  
Дата: 17.05.11 17:14
Оценка:
День добрый. Проблема следующая. Пытаюсь прицепить поле объекта класса, унаследованного от UserControl к DataTemplate TabItem`a. Ничего не получается. При этом если класс не унаследован от Control`a, то биндится все нормально и отображается то, что нужно. К контролам биндинг осуществляется по собому чтоли?
Re: WPF DataTemplate к UserControl
От: MxMsk Португалия  
Дата: 17.05.11 19:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>День добрый. Проблема следующая. Пытаюсь прицепить поле объекта класса, унаследованного от UserControl к DataTemplate TabItem`a. Ничего не получается. При этом если класс не унаследован от Control`a, то биндится все нормально и отображается то, что нужно. К контролам биндинг осуществляется по собому чтоли?

Нет, ничего особенного. Давай поглядим, как ты привязываешь поле?
Re[2]: WPF DataTemplate к UserControl
От: Аноним  
Дата: 18.05.11 06:34
Оценка:
Здравствуйте, 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;
Re[3]: WPF DataTemplate к UserControl
От: MxMsk Португалия  
Дата: 18.05.11 08:03
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вот определение шаблона (жирным выделена злосчастная привязка):

Здесь сыграла роль специфика реализации 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}"


Как-то так
Re[4]: WPF DataTemplate к UserControl
От: Аноним  
Дата: 18.05.11 09:35
Оценка:
Здравствуйте, MxMsk, Вы писали:

MM>Как-то так


Помогло, спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.