2011-06-20 2 views
1

J'ai un WPF CustomControl qui est dérivé de ComboBox et j'essaie de comprendre comment personnaliser l'affichage des éléments. Fondamentalement, je veux que la plupart des éléments à afficher avec du texte normal, mais en fonction des données dans chaque objet objet, je voudrais que certains affichent gras ou italique. Normalement, je le fais directement dans le XAML, mais comme il s'agit d'un CustomControl, je suis un peu perdu. J'aimerais pouvoir le lier directement dans le code, mais je suis également ouvert aux méthodes qui pourraient impliquer le chargement dans des styles XAML externes, si vous pouvez me montrer comment faire cela (je n'ai pas la moindre idée).Appliquer ItemTemplate Style aux éléments ComboBox d'un WPF CustomControl dérivé de ComboBox

Le code ci-dessous est une approximation de base du contrôle que j'utilise mais grandement simplifié. Cependant, le concept de base de la façon dont les données sont chargées est le même et les objets de données eux-mêmes proviennent d'une source externe, de sorte qu'ils ne peuvent pas accéder au contrôle lui-même de toute façon. Le modèle doit juste être lié aux propriétés de base.

public class FormatData 
{ 
    public FormatData() { } 
    public string Name { get; set; } 
    public bool Bold { get; set; } 
    public bool Italic { get; set; } 
} 

public class FormatDropDown : System.Windows.Controls.ComboBox 
{ 
    public FormatDropDown() 
    { 
    } 

    public void LoadSelection(FormatData[] data) 
    { 
     try 
     { 
      this.ItemsSource = data; 
      this.DisplayMemberPath = "Name"; 
     } 
     catch (Exception e) { MessageBox.Show(e.Message); ; } 
    } 
} 

Le contrôle est rempli comme suit:

 var data = new FormatData[]{ 
      new FormatData(){ 
       Name = "Normal" 
      }, 
      new FormatData(){ 
       Name = "Bold", 
       Bold = true 
      }, 
      new FormatData(){ 
       Name = "Italic", 
       Italic = true 
      }, 
      new FormatData(){ 
       Name = "BoldItalic", 
       Bold = true, 
       Italic = true 
      }, 
     }; 

     fddTest.LoadSelection(data); 

Quelqu'un a une idée de la façon dont je peux y parvenir?

Répondre

2

Que diriez-vous ceci:

public class FormatDropDown : System.Windows.Controls.ComboBox { 
    static FormatDropDown() { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(FormatDropDown), new FrameworkPropertyMetadata(typeof(FormatDropDown))); 
    } 

    public void LoadSelection(FormatData[] data) { 
     try { 
      this.ItemsSource = data; 
      this.DisplayMemberPath = "Name"; 
     } catch (Exception e) { MessageBox.Show(e.Message); ; } 
    } 
} 

Et dans le fichier thème (generic.xaml):

<Style TargetType="{x:Type local:FormatDropDown}" BasedOn="{StaticResource {x:Type ComboBox}}"> 
    <Setter Property="ItemContainerStyle"> 
     <Setter.Value> 
      <Style TargetType="ComboBoxItem"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Bold}" Value="True"> 
         <Setter Property="FontWeight" Value="Bold" /> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding Italic}" Value="True"> 
         <Setter Property="FontStyle" Value="Italic" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Setter.Value> 
    </Setter> 
</Style> 

override donc essentiellement la DefaultStyleKey pour votre contrôle personnalisé.