2015-09-29 6 views
0

У меня есть элемент управления вкладки с определенными (как Style в TabControl.ItemContainerStyle) Шаблоны HeaderTemplate и ContentTemplate. Элемент управления вкладкой не имеет источника. Элемент Содержимое имеет пользовательский элемент управления с собственностью Статус. Заголовок элемента имеет текстовый блок, в котором этот статус должен отображаться. Мой вопрос в том, как связать это?Как связать заголовок управления вкладкой с содержимым управления вкладкой?

<TabControl x:Name="tbMain"> 
    <TabControl.ItemContainerStyle> 
     <Style TargetType="TabItem"> 
      <Setter Property="Padding" Value="0"/> 
      <Setter Property="ContentTemplate"> 
       <Setter.Value> 
        <DataTemplate> 
         <local:Session x:Name="session"/> 
        </DataTemplate> 
       </Setter.Value> 
      </Setter> 
      <Setter Property="HeaderTemplate"> 
       <Setter.Value> 
        <DataTemplate> 
         <Grid> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition/> 
           <ColumnDefinition/> 
           <ColumnDefinition/> 
          </Grid.ColumnDefinitions> 
          <Image VerticalAlignment="Center" Width="18" Height="18" Source="Resources/bullet_green.png"/> 
          <TextBlock Grid.Column="1" VerticalAlignment="Center" Margin="1" Foreground="Green" Text="{Binding ?? session.Status}"/> 
          <Button x:Name="btnDelete" Grid.Column="2" Margin="1" Content="asdasd" VerticalAlignment="Center" Style="{DynamicResource CloseButton}" Click="btnDelete_Click" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}}, Path=Name}"/> 
         </Grid> 
        </DataTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </TabControl.ItemContainerStyle> 
</TabControl> 
+0

Пожалуйста, ваша (соответствующая) XAML разметка. – dymanoid

+0

@dymanoid сделано. – Andrew

+0

Вы пытались связать с синтаксисом «ElementName»? Что-то вроде '' – Bruno

ответ

1

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

Следующий пример работает для меня:

using System.Windows; 
using System.Windows.Controls; 

namespace StackOverflow 
{ 

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = this; 
     Status = "STATUS FROM VM"; 
    } 

    public string Status { get; set; } 
} 

public class Session : Control 
{ 
    public static readonly DependencyProperty StatusProperty = 
     DependencyProperty.Register("Status", typeof(string), typeof(Session), new PropertyMetadata("My Status")); 

    static Session() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(Session), new FrameworkPropertyMetadata(typeof(Session))); 
    } 

    public string Status 
    { 
     get { return (string)GetValue(StatusProperty); } 
     set { SetValue(StatusProperty, value); } 
    } 
} 
} 

И в XAML:

<TabControl x:Name="tbMain"> 
     <TabControl.ItemContainerStyle> 
      <Style TargetType="TabItem"> 
       <Setter Property="Padding" Value="0"/> 
       <Setter Property="ContentTemplate"> 
        <Setter.Value> 
         <DataTemplate> 
          <stackOverflow:Session x:Name="session" Status="{Binding Status}"> 
           <stackOverflow:Session.Template> 
            <ControlTemplate TargetType="stackOverflow:Session"> 
             <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=TabControl}, Path=DataContext.Status}"></TextBlock> 
            </ControlTemplate> 
           </stackOverflow:Session.Template> 
          </stackOverflow:Session> 
         </DataTemplate> 
        </Setter.Value> 
       </Setter> 
       <Setter Property="HeaderTemplate"> 
        <Setter.Value> 
         <DataTemplate> 
          <Grid> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition/> 
            <ColumnDefinition/> 
            <ColumnDefinition/> 
           </Grid.ColumnDefinitions> 

           <TextBlock Grid.Column="1" VerticalAlignment="Center" Margin="1" Foreground="Green" Text="{Binding RelativeSource={RelativeSource AncestorType=TabControl}, Path=DataContext.Status}"/> 
           <Button x:Name="btnDelete" Grid.Column="2" Margin="1" Content="asdasd" VerticalAlignment="Center" /> 
          </Grid> 
         </DataTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </TabControl.ItemContainerStyle> 
     <TabItem></TabItem> 
    </TabControl> 
+0

Большое спасибо за решение. Мне это нравится, но это немного отличается от того, что мне нужно. В случае, если * session * control имеет клиент сокета, и мне нужно отобразить статус соединения сокета в заголовке вкладки. Мне нужно избегать сохранения статусов в классе главного окна. Если бы я использовал это решение, я мог бы просто определить источник Items для элемента управления вкладкой и связать его. Но класс основного окна не должен иметь никакой информации о сеансах. Сессия имеет свойство Status, которое должно отображаться в заголовке. – Andrew

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