Supponiamo di avere un collegamento DataSource a una raccolta dal database. Non esiste ovviamente un oggetto nullo. Come aggiungere un elemento vuoto in un ComboBox, in modo che al primo caricamento l'utente possa vedere una stringa vuota. Non voglio aggiungere un oggetto fittizio/vuoto alla Raccolta. Ottimamente in XAML. Qualche proposta?ComboBox con articolo vuoto?
risposta
<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
Come @surfen menzionato nel commento, BindingProxy è soluzione per il problema di legame
OK meraviglioso. Ma come rendere il primo oggetto non selezionabile? È possibile selezionare solo gli elementi dell'origine dati. –
Vedere post modificato, è sufficiente aggiungere IsEnabled = "False" Primo piano = "Nero" alle proprietà degli articoli –
OK scusate non ho notato che proprietà. Grazie ! –
<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;
}
}
}
Puoi spiegare perché questo lavori? – nikaltipar
Questo funziona per abbonarsi all'evento mouse up –
Per vincolante per MVVM oggetto:
<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>
E per il legame on:
<Label Visibility="{Binding Path=SelectedValue, ElementName=cbbFiltres, Converter={StaticResource NullToVisibility}}" />
e il convertitore generico:
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;
}
}
Proprio importante dichiarare il SelectedValuePath in combobox. :-)
- 1. WPF ComboBox: Articolo errato viene visualizzato
- 2. WPF ComboBox SelectedValue binding con valore null viene visualizzato vuoto
- 3. "Possiedi già questo articolo" ma getPurchases è vuoto
- 4. BeanFieldGroup con ComboBox?
- 5. C# Messagebox Con ComboBox
- 6. WPF DataGrid singolo clic per creare un nuovo articolo
- 7. ComboBox Databound WPF con elemento 'Nuovo ...'
- 8. come associare ComboBox con DataTable
- 9. ID nascosto con elementi ComboBox?
- 10. Bind Combobox con Enum Descrizione
- 11. WPF: Nullable ComboBox
- 12. Uguale (articolo, null) o articolo == null
- 13. ComboBox Behavior
- 14. ComboBox WPF per dattilografi lenti
- 15. Combobox Vaadin
- 16. Aspetto Combobox
- 17. Sfinge: articolo indicizzato con riferimento incrociato
- 18. ComboBox modificabile
- 19. Istruzione while con ritorno grep vuoto/vuoto?
- 20. Combobox borderstyle
- 21. Riempimento di Extjs Combobox con dati statici
- 22. Come "compilare" una GridViewColumn con ComboBox (WPF)?
- 23. WPF Combobox con auto-completamento/filtro automatico?
- 24. Combobox Javascript con elementi typeahead e gerarchici
- 25. ComboBox SelectedValue non mostra
- 26. Concatenato generatore e articolo
- 27. WPF valore combobox e visualizzazione del testo
- 28. QListWidget: Event articolo scatti
- 29. Discussione in doppio di un articolo ACM Articolo in LaTeX
- 30. Collezione modifica articolo
Attenzione, che la soluzione fornita non funziona con il legame. – Cartesius00
Ho trovato un modo per aggirare il problema di binding vedere questo post: http://stackoverflow.com/questions/6446699/how-do-you-bind-a-collectioncontainer-to-a-collection-in-a-view-model – Frinavale