2009-11-12 4 views
1

EDIT: Solution dans le code peut être trouvé sur le fond. Je ne suis pas sûr si je "pense mal". Supposons que j'ai un ListBox, et je veux ajouter des choses différentes à ce ListBox. Bien sûr, je sais que je pourrais changer le ItemTemplate, ajouter une liaison de données, pour afficher mes classes personnalisées.WPF - Types personnalisés de formatage automatique comment? (ControlTemplate, Style ..)

Mais c'est "spécial". Je cherche un moyen de créer un look "par défaut" pour mon DataWrapper, indépendamment de l'endroit où il est utilisé.

Si j'essaie de créer un style pour cela, il se plaint que la classe ne descend pas de FrameworkElement. Ok, moyen facile, faites DataWrapper enfant de FrameworkElement. Mais cela "se sent mal", car il s'agit d'un objet métier, pas d'un élément d'interface utilisateur.

Je suis un peu coincé, je sais qu'il doit y avoir un moyen de dire à WPF comment rendre les éléments qu'il ne connaît pas. Actuellement, il affiche le nom complet de la classe.

Alors, quel est le moyen le plus simple d'obtenir, par ex. le DataWrapper comme TextBlock avec le fond vert, le DataWrapper2 comme TextBlock avec le fond bleu. Affichage de la chaîne de données. Je sais obligatoire et tout ce genre de choses, je suis juste coincé avec la façon de dire WPF:

Si l'un de vos enfants est un DataWrapper, s'il vous plaît render cette façon. Si elle est DataWrapper2, s'il vous plaît rendre cette façon ...

Voici un code tryout:

public class DataWrapper 
{ 
    public string Data { get; set; } 
} 

public class DataWrapper2 
{ 
    public string Data { get; set; } 
} 

public static class ListBoxTest 
{ 
    public static ListBox CreateTestInstance() 
    { 
     var lB = new ListBox(); 

     var items = new ObservableCollection<object> 
         { 
          23.5, 
          "Hello World", 
          new Button() {Content = "Click me"}, 
          new DataWrapper() {Data = "Some text"}, 
          new DataWrapper2() {Data = "Other text"}, 
          "string again" 
         }; 

     lB.ItemsSource = items; 

     var dT = CreateDataTemplate(); 

     lB.Resources.Add(dT.DataTemplateKey, dT); 
     return lB; 
    } 

    public static DataTemplate CreateDataTemplate() 
    { 
     var dT = new DataTemplate(typeof(DataWrapper)); 
     var elementFactory = new FrameworkElementFactory(typeof(TextBlock)); 
     elementFactory.SetBinding(TextBlock.TextProperty, new Binding("Data")); 

     dT.VisualTree = elementFactory; 

     return dT; 
    } 
} 

Répondre

2

Voir DataTemplate.DataType. De la documentation: "Lorsque vous définissez cette propriété sur le type de données sans spécifier une clé x:, le DataTemplate est automatiquement appliqué aux objets de données de ce type."

Pour un contrôle plus précis, vous pouvez également utiliser un DataTemplateSelector.

+0

Merci, je savais que ce n'était pas si difficile. Je me suis perdu un peu dans toutes mes tentatives ... Code mis à jour, si quelqu'un d'autre veut savoir comment .. –