2010-03-19 6 views
1

J'ai eu du mal avec ça pendant un moment, cela aurait été simple à faire dans WindowForms.WPF TabItem Custom ContentTemplate

Je crée un client IRC, il y aura un certain nombre d'onglets pour chaque canal se connecter. Chaque onglet doit afficher un certain nombre de choses, UserList, MessageHistory, Topic.

Dans WindowForms, j'aurais simplement hérité de TabItem, ajouté quelques propriétés personnalisées, et Controls, et done.

Dans WPF, j'ai quelques problèmes avec comment faire.

J'ai essayé plusieurs façons de le faire, et ci-dessous est ma méthode actuelle, mais je ne peux pas obtenir le TextBox pour lier à la propriété Topic.

<Style TargetType="{x:Type t:IRCTabItem}" BasedOn="{StaticResource {x:Type TabItem}}" > 
    <Setter Property="ContentTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
       <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="540" /> 
         <ColumnDefinition /> 
        </Grid.ColumnDefinitions> 
        <StackPanel Grid.Column="0"> 
         <TextBox Text="{Binding Topic, RelativeSource={RelativeSource AncestorType={x:Type t:IRCTabItem}}}" /> 
        </StackPanel> 
       </Grid> 
      </DataTemplate>    
     </Setter.Value> 
    </Setter> 
</Style> 

Et le Codebehind

public class IRCTabItem : TabItem 
    { 
     static IRCTabItem() 
     { 
      //This OverrideMetadata call tells the system that this element wants to provide a style that is different than its base class. 
      //This style is defined in themes\generic.xaml 
      //DefaultStyleKeyProperty.OverrideMetadata(typeof(IRCTabItem), 
      // new FrameworkPropertyMetadata(typeof(IRCTabItem))); 
     } 

     public static readonly RoutedEvent CloseTabEvent = 
      EventManager.RegisterRoutedEvent("CloseTab", RoutingStrategy.Bubble, 
       typeof(RoutedEventHandler), typeof(IRCTabItem)); 

     public event RoutedEventHandler CloseTab 
     { 
      add { AddHandler(CloseTabEvent, value); } 
      remove { RemoveHandler(CloseTabEvent, value); } 
     } 

     public override void OnApplyTemplate() 
     { 
      base.OnApplyTemplate(); 

      Button closeButton = base.GetTemplateChild("PART_Close") as Button; 
      if (closeButton != null) 
       closeButton.Click += new System.Windows.RoutedEventHandler(closeButton_Click); 
     } 

     void closeButton_Click(object sender, System.Windows.RoutedEventArgs e) 
     { 
      this.RaiseEvent(new RoutedEventArgs(CloseTabEvent, this)); 
     } 

     public bool Closeable 
     { 
      get { return (bool)GetValue(CloseableProperty); } 
      set { SetValue(CloseableProperty, value); } 
     } 
     public static readonly DependencyProperty CloseableProperty = DependencyProperty.Register("Closeable", typeof(bool), typeof(IRCTabItem), new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); 


     public List<String> UserList 
     { 
      get { return (List<string>)GetValue(UserListProperty); } 
      set { SetValue(UserListProperty, value); } 
     } 
     public static readonly DependencyProperty UserListProperty = DependencyProperty.Register("UserList", typeof(List<String>), typeof(IRCTabItem), new FrameworkPropertyMetadata(new List<String>(), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); 

     public String Topic 
     { 
      get { return (string)GetValue(TopicProperty); } 
      set { SetValue(TopicProperty, value); } 
     } 
     public static readonly DependencyProperty TopicProperty = DependencyProperty.Register("Topic", typeof(String), typeof(IRCTabItem), new FrameworkPropertyMetadata("Not Connected", FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); 

     public bool HasAlerts 
     { 
      get { return (bool)GetValue(HasAlertsProperty); } 
      set { SetValue(HasAlertsProperty, value); } 
     } 
     public static readonly DependencyProperty HasAlertsProperty = DependencyProperty.Register("HasAlerts", typeof(bool), typeof(IRCTabItem), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); 


    } 

Mes questions sont les suivantes:

que je fais de la bonne façon (les meilleures pratiques)? Si oui, comment lier DataTemplate aux propriétés? Sinon, quelle est la bonne façon de réaliser ce que j'essaie d'accomplir?

Edit 1: Ajouté Peter Stephens Suggestions Modifier 2: Ajout Modifier visible Résumé Edit 3: Mots

+0

Vous devriez probablement ajouter une sorte de commentaire visible lorsque vous éditez votre question de telle sorte que certaines des réponses existantes n'ont plus de sens. De plus, lorsque vous avez apporté le changement à votre code, Peter Stephens l'a suggéré, est-ce que cela a corrigé quelque chose? –

+0

Je pensais que j'avais ajouté un résumé d'édition - le fera maintenant. La chose Peter Stephens suggéré n'a pas fait de différence notable – lloydsparkes

Répondre

0

Un problème que vous avez est que vos propriétés de dépendance sont mises en œuvre de manière incorrecte.

sujet devrait être mis en œuvre comme ceci:

public String Topic 
{ 
    get { return (string) GetValue(TopicProperty); } 
    set { SetValue(TopicProperty, value); } 
} 
public static readonly DependencyProperty TopicProperty = 
    DependencyProperty.Register("Topic", typeof(String), 
     typeof(IRCTabItem), new FrameworkPropertyMetadata("Not Connected", 
     FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); 

Vous devez traiter la propriété CLR que le sucre syntaxique entourant la propriété de dépendance WPF. Laissez la propriété WPF gérer le stockage de la valeur, sinon vous aurez effectivement deux propriétés avec deux valeurs différentes.

+0

Merci pour cela, c'est bon à savoir :) – lloydsparkes

0

Je crois que votre expression de liaison manque le mode pour la source relative.

Essayez ceci:

<TextBox Text="{Binding Topic, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type t:IRCTabItem}}}" /> 

La valeur par défaut pour le mode est nul, donc si vous n'incluez pas que les choses vont probablement réglage fonctionne pas si bien.

+0

Merci pour votre réponse. J'ai ajouté cette modification, et cela ne change rien :( – lloydsparkes

Questions connexes