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
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? –
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