llenar from and wpf combobox

from - wpf combobox selectionchanged



ComboBox con el artículo vacío? (4)

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 , de modo que en un primer momento el usuario vea una cadena vacía. No quiero agregar un objeto ficticio / vacío a la Colección. Óptimamente en XAML . ¿Alguna propuesta?


Para vincular el objeto 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>

Y para atar en:

<Label Visibility="{Binding Path=SelectedValue, ElementName=cbbFiltres, Converter={StaticResource NullToVisibility}}" />

Y el convertidor 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://.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; } }

Solo es importante declarar SelectedValuePath en el cuadro combinado. :-)


Pruebe el cuadro combinado de Mahapps.

xmlns: controls = "http://metro.mahapps.com/winfx/xaml/controls"

<ComboBox x:Name="bars" **controls:TextBoxHelper.ClearTextButton="True"** DisplayMemberPath="Name" Height="21" SelectedItem="{Binding Bar}"/>


<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 mencionó en el comentario, BindingProxy es una solución para el problema vinculante


<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; } } }