values - WPF Editable ComboBox
comboboxitem value wpf (3)
Tengo una propiedad ComboBox y ComboBox.IsEditable se establece en True para que ComboBox actúe como un TextBox y una lista desplegable simultáneamente. Pero cuando el ComboBox está vinculado a datos, al ingresar texto personalizado no se agregará un nuevo elemento a la colección enlazada a datos.
Por ejemplo, si ingreso ''Joe'' en un ComboBox que está vinculado a una lista de personas, que no contiene el valor ''Joe'', entonces el valor ''Joe'' no se agregará a la lista desplegable automáticamente.
¿Cuál es la mejor manera de manejar esto?
Lo manejaría en el evento LostFocus.
Aquí puede verificar si SelectedItem es nulo. Si es así, agregue el valor de Texto a la lista encuadernada y establezca SelectedItem en el nuevo elemento.
En XAML:
<ComboBox Name="_list" LostFocus="LostFocus" IsEditable="True"/>
En código subyacente:
private ObservableCollection<string> _names;
public MainWindow()
{
InitializeComponent();
_names = new ObservableCollection<string> {"Eric", "Phillip"};
_list.SetBinding(ItemsControl.ItemsSourceProperty, new Binding {Source = _names});
}
private void LostFocus(object sender, RoutedEventArgs e)
{
var comboBox = (ComboBox) sender;
if(comboBox.SelectedItem != null)
return;
var newItem = comboBox.Text;
_names.Add(newItem);
comboBox.SelectedItem = newItem;
}
Espero que esto ayude :)
Mi sugerencia sería utilizar un enfoque MVVM y vincular su ComboBox.Text a algunos TextProperty de su ViewModel. (Lo mismo se puede lograr simplemente agregando una propiedad de cadena a su vista) Luego puede tratar la entrada en el colocador de esta propiedad y agregar ese nuevo elemento a la lista, sin importar en qué forma se "comprometió" en la vista. AFAIK no existe un mecanismo listo para usar para agregar nuevos elementos a su fuente de datos, de todos modos tendrá que hacer la generación de artículos usted mismo.
Alternativamente, puede vincular ambos elementos, SelectedItem y Text de su ComboBox, para evitar búsquedas en caso de que el usuario haya ingresado un elemento conocido. Pero esa parte puede ser menos importante para responder su pregunta.
Aquí hay una forma básica de MVVM
para obtener el comportamiento que desea:
MainWindow.xaml
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<ComboBox Margin="30,5,30,5"
IsEditable="True"
ItemsSource="{Binding Items}"
SelectedItem="{Binding SelectedItem}"
Text="{Binding NewItem, UpdateSourceTrigger=LostFocus}"/>
<TextBox Margin="30,5,30,5" />
</StackPanel>
</Window>
MainWindow.cs
public partial class MainWindow : Window, INotifyPropertyChanged
{
private string _selectedItem;
private ObservableCollection<string> _items = new ObservableCollection<string>()
{
"One",
"Two",
"Three",
"Four",
"Five",
};
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
}
public IEnumerable Items
{
get { return _items; }
}
public string SelectedItem
{
get { return _selectedItem; }
set
{
_selectedItem = value;
OnPropertyChanged("SelectedItem");
}
}
public string NewItem
{
set
{
if (SelectedItem != null)
{
return;
}
if (!string.IsNullOrEmpty(value))
{
_items.Add(value);
SelectedItem = value;
}
}
}
protected void OnPropertyChanged(string propertyName)
{
var handler = this.PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
Tuve que colocar otro control en la ventana ya que configuré la propiedad UpdateSourceTrigger
del enlace de Text
a LostFocus
. Si no hay otros controles en la ventana, el Combobox
nunca perderá el foco.
Cambié el modo de actualización porque el modo de actualización predeterminado es el de Cambio de Propertychanged
que agregará un nuevo elemento para cada golpe de teclado.
Por ejemplo, si ingresó el texto "Ventana", se agregará lo siguiente a su colección:
W
Wi
Win
Wind
Windo
Window