Supposons que nous ayons une liaison DataSource à une collection de la base de données. Il n'y a pas d'article nul bien sûr. Comment ajouter un élément vide dans une zone de liste déroulante, de sorte qu'au premier utilisateur de chargement verrait une chaîne vide. Je ne veux pas ajouter un objet factice/vide dans la collection. Optimalement dans XAML. Des propositions?ComboBox avec élément vide?
Répondre
<ComboBox Name="myComboBox" Width="200" Background="White">
<ComboBox.ItemsSource>
<CompositeCollection>
<ComboBoxItem IsEnabled="False" Foreground="Black">Select Item</ComboBoxItem>
<CollectionContainer Collection="{Binding Source={StaticResource DataKey}}" />
</CompositeCollection>
</ComboBox.ItemsSource>
</ComboBox>
EDIT
Comme @surfen mentionné dans le commentaire, BindingProxy est solution pour le problème de liaison
OK merveilleux. Mais comment rendre le premier élément non sélectionnable? Seuls les éléments de source de données peuvent être sélectionnés. –
Voir le message édité, il vous suffit d'ajouter IsEnabled = "False" Foreground = "Black" pour les propriétés des articles –
OK désolé je n'ai pas remarqué que les propriétés. Je vous remercie ! –
<UserControl.Resources>
<CollectionViewSource x:Key="Modules" Source="{Binding Path=Modules}" />
</UserControl.Resources>
<abv:ComboBox SelectedIndex="0" IsNullable="True"
SelectedItem="{Binding Path=SelectedModule, Mode=TwoWay}">
<abv:ComboBox.ItemsSource>
<CompositeCollection>
<ComboBoxItem Content="{DynamicResource EmptyModuleComboBox}"/>
<CollectionContainer Collection="{Binding Source={StaticResource Modules}}" />
</CompositeCollection>
</abv:ComboBox.ItemsSource>
</abv:ComboBox>
public class ComboBox : System.Windows.Controls.ComboBox
{
public static readonly DependencyProperty IsNullableProperty =
DependencyProperty.Register("IsNullable", typeof(bool), typeof(ComboBox));
public bool IsNullable
{
get { return (bool)GetValue(IsNullableProperty); }
set { SetValue(IsNullableProperty, value); }
}
public ComboBox()
{
Loaded += ComboBox_Loaded;
}
void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
if (IsNullable)
{
this.ItemContainerStyle = new Style();
this.ItemContainerStyle.Setters.Add(new EventSetter()
{
Event = ComboBoxItem.PreviewMouseUpEvent,
Handler = new MouseButtonEventHandler(cmbItem_PreviewMouseUp)
});
}
}
public void cmbItem_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
if (Items.IndexOf(sender as ComboBoxItem) == 0)
{
SelectedItem = null;
}
}
}
Pourriez-vous expliquer pourquoi cette travaux? – nikaltipar
Ceci fonctionne à cause d'un événement souris –
Pour la liaison sur l'objet MVVM:
<ComboBox Name="cbbFiltres" SelectedItem="{Binding ElmtInfo, Mode=TwoWay}" Height="26" MinWidth="90" SelectedIndex="0" SelectedValuePath="Id">
<ComboBox.Resources>
<CollectionViewSource x:Key="cvsFiltres" Source="{Binding Elmts.items}"/>
</ComboBox.Resources>
<ComboBox.ItemsSource>
<CompositeCollection>
<model:tblFiltreChamps Desc="{x:Static resx:resMain.enumAucun}" Id="0"/>
<CollectionContainer Collection="{Binding Source={StaticResource cvsFiltres}}" />
</CompositeCollection>
</ComboBox.ItemsSource>
</ComboBox>
Et pour la liaison sur:
<Label Visibility="{Binding Path=SelectedValue, ElementName=cbbFiltres, Converter={StaticResource NullToVisibility}}" />
Et le convertisseur générique:
public class ConvNullToVisibility : IValueConverter {
/// <summary>Convertisseur pour le Get.</summary>
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
if (DesignerProperties.GetIsInDesignMode(new DependencyObject())) return Visibility.Visible; // Pour annuler l'effet dans le designer: http://stackoverflow.com/questions/33401900/wpf-detect-design-mode-in-a-converter
return ((value == null) || (string.IsNullOrEmpty(value.ToString())) || (value.ToString() == "0")) ? Visibility.Collapsed : Visibility.Visible;
}
/// <summary>Convertisseur inverse, pour le Set (Binding).</summary>
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
if (value is Visibility) {
return (((Visibility)value) == Visibility.Visible) ? true : false;
} else return false;
}
}
Juste important de déclarer la SelectedValuePath dans combobox. :-)
- 1. ComboBox Élément sélectionné dans WPF
- 2. Combobox lindrable - élément/index sélectionné
- 3. Reliure WPF ComboBox à un élément
- 4. Problèmes avec DataGridTemplateColumn avec ComboBox
- 5. Création d'un élément vide s'il n'existe pas
- 6. Effacement de la valeur vide par défaut dans un objet Combobox Winform de type: DropDownList
- 7. WPF Binding Collection Pour ComboBox et la sélection d'un élément
- 8. Ecran vide avec CodeIgniter
- 9. ComboBox Remplissage avec LINQ C#
- 10. DropDownList AppendDataBoundItems (premier élément à être vide et aucun doublon)
- 11. ComboBox générique avec propriétés nommées automatiquement
- 12. Élément réellement vide avec le serveur sql pour la directive xml
- 13. YAML: dictionnaire avec valeur vide
- 14. Java Liste avec vide autorisé
- 15. obout combobox setValue()
- 16. Ajouter une chaîne vide à RadComboBox
- 17. Modèle vide, table vide
- 18. aide avec struts2 forme et combobox
- 19. ComboBox avec ItemTemplate qui comprend un bouton
- 20. Valider l'entrée avec ComboBox de BWidget
- 21. utiliser combobox flexbox jquery avec asp.net
- 22. Composant personnalisé avec comportement de type combobox
- 23. Remplir combobox avec des mois anglais
- 24. Combobox avec des opérateurs de comparaison
- 25. ComboBox lié aux valeurs d'un type enum tout en ayant une entrée "vide"?
- 26. Java Swing Combobox avec saisie semi-automatique et contexte Menu
- 27. C# ComboBox GotFocus
- 28. DataBinding à ComboBox dans VB.Net
- 29. ComboBox éditable
- 30. ComboBox Silverlight et SelectedItem
Prenez garde, que la solution fournie ne fonctionne pas avec la liaison. – Cartesius00
J'ai trouvé un moyen de contourner le problème de liaison voir ce post: http://stackoverflow.com/questions/6446699/how-do-you-bind-a-collectioncontainer-to-a-collection-in-a-view-model – Frinavale