Supongamos que tenemos un enlace de DataSource a una colección de la base de datos. No hay un elemento nulo, por supuesto. Cómo agregar un elemento vacío en un ComboBox, para que al primer usuario de carga vea una cadena vacía. No quiero agregar un objeto ficticio/vacío a la Colección. Óptimamente en XAML. ¿Alguna propuesta?ComboBox con el artículo vacío?
Respuesta
<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>
EDITAR
Como @surfen mencionado en el comentario, BindingProxy es solución para el problema de unión
OK maravilloso. Pero, ¿cómo hacer que el primer elemento no sea seleccionable? Solo se pueden seleccionar elementos de origen de datos. –
Ver la publicación editada, solo necesita agregar IsEnabled = "False" Foreground = "Black" a las propiedades de los elementos –
OK lo siento, no me di cuenta de esas propiedades. Gracias ! –
<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;
}
}
}
¿Podría explicar por qué esto ¿trabajos? – nikaltipar
Esto funciona porque se suscribe al evento de mouse up –
Para la unión de MVVM objeto:
<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>
Y para la unión en:
<Label Visibility="{Binding Path=SelectedValue, ElementName=cbbFiltres, Converter={StaticResource NullToVisibility}}" />
Y el conversor genérico:
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;
}
}
sólo importante para declarar la SelectedValuePath en cuadro combinado. :-)
- 1. Cómo insertar el campo 'Vacío' en ComboBox vinculado a DataTable
- 2. Llenar un ComboBox con C#
- 3. C# Messagebox Con ComboBox
- 4. Id oculto con elementos de ComboBox?
- 5. Compatibilidad con el comando WPF en ComboBox
- 6. WPF: ComboBox anulable
- 7. cómo enlazar ComboBox con DataTable
- 8. ExtJS ComboBox 4 Autocompletar
- 9. Calcular la diferencia con el artículo anterior con LINQ
- 10. Implementación Singleton con el constructor estático vacío
- 11. wpf combobox binding
- 12. ComboBox Comportamiento
- 13. combobox contiene el valor especificado
- 14. WPF Combobox DisplayMemberPath
- 15. ComboBox editable
- 16. Vaadin combobox
- 17. Combobox WPF con autocompletar/auto-filtro?
- 18. Vaadin ComboBox con valores e ID
- 19. Rellenar ComboBox con lista de fuentes disponibles
- 20. jquery ui autocompletar combobox con categorías
- 21. Display enumeración en ComboBox con espacios
- 22. Usando MongoDB con rieles - ¿Algún artículo bueno?
- 23. Combobox con casilla de verificación en winforms
- 24. Crear WinForms ComboBox con elementos no seleccionables
- 25. ComboBox SelectedValue no muestra
- 26. ComboBox de WPF de datos con 'Nuevo ...' elemento
- 27. Mostrar FontFamily en Combobox
- 28. Artículo de Android ActionBar con solo texto
- 29. Fetch un artículo de Wikipedia con Python
- 30. HttpWebRequest cookie con dominio vacío
Ten cuidado, que la solución proporcionada no funciona con la unión. – Cartesius00
Encontré una forma de resolver el problema vinculante. Ver esta publicación: http://stackoverflow.com/questions/6446699/how-do-you-bind-a-collectioncontainer-to-a-collection-in-a-view-model – Frinavale