2010-02-03 7 views
1

Je voudrais avoir une liste déroulante qui permet la sélection d'une liste de valeurs et permet également une valeur personnalisée à partir du texte tapé. Pour des raisons d'affichage, les éléments sont de type complexe (disons que le modèle d'élément de liste déroulante affiche un patch de couleur et un drapeau indiquant s'il s'agit d'une couleur personnalisée).Comment faire un WPF ComboBox modifiable avec des valeurs personnalisées

public class ColorLevel 
{ 
    public decimal Intensity { get; set; } 
    public bool IsCustom { get; set; } 
    public Color BaseColor { get; set; } 
    public override ToString() { return string.Format("{0}", Intensity*100); } 
} 

articles Exemple

var items = new [] { 
    new ColorLevel { Intensity = 0.9m, IsCustom = false, BaseColor = Color.Red }, 
    new ColorLevel { Intensity = 0.7m, IsCustom = false, BaseColor = Color.Red } 
} 

XAML

<ComboBox SelectedItem="{Binding Path=SelectedColorLevel}" 
      IsEditable="true" IsTextSearchEnabled="true"> 
</ComboBox> 

Ainsi, les travaux de balisage ci-dessus lorsqu'un élément est sélectionné dans la liste des éléments. Et lorsque vous tapez avec la recherche de texte, les éléments correspondants sont sélectionnés. Si le texte tapé ne correspond pas à un élément, alors SelectedColorLevel est défini sur null.

La question est à quel point (et comment) est-il préférable de créer un nouvel élément personnalisé qui peut être défini sur SelectedColorLevel lorsque le texte tapé ne correspond pas à un élément.

Par exemple je voudrais attribuer un nouvel élément à la valeur sélectionnée, comme

new ColorLevel { Intensity = decimal.Parse(textvalue), IsCustom = true } 

ou en utilisant un convertisseur approprié et databinding à la propriété Text.

Répondre

0

Je ne sais pas si j'ai bien compris .. Vous pouvez utiliser l'événement KeyDown pour ajouter un nouveau ColorLevel, par exemple lorsque vous appuyez sur Return. Si les éléments sont des ObservableCollection et que vous les définissez en tant que ItemsSource de ComboBox, le nouveau ColorLevel ajouté aux éléments doit être disponible dans la liste et devenir SelectedItem.

Questions connexes