Search code examples
c#wpfmvvmcomboboxauto-update

WPF - Auto refresh combobox content


I got a sample mvvm app. The UI has a textbox, a button and a combobox. when I enter something in the textbox and hit the button, the text I enter gets added to an observablecollection. The Combobox is bound to that collection. How do I get the combobox to display the newly added string automaticly?


Solution

  • As I understand correctly, you want to add an item and select it. Here is the example how it can be done using ViewModel and bindings.

    Xaml:

    <StackPanel>
        <TextBox Text="{Binding ItemToAdd}"/>
        <ComboBox ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" />
        <Button Content="Add" Click="Button_Click"/>
    </StackPanel>
    

    ViewModel:

    public class MainViewModel:INotifyPropertyChanged
    {
        public ObservableCollection<string> Items { get; set; }
    
        public string ItemToAdd { get; set; }
    
        private string selectedItem;
    
        public string SelectedItem
        {
            get { return selectedItem; }
            set
            {
                selectedItem = value;
                OnPropertyChanged("SelectedItem");
            }
        }
    
        public void AddNewItem()
        {
            this.Items.Add(this.ItemToAdd);
            this.SelectedItem = this.ItemToAdd;
        }
    
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected virtual void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
    

    The MainViewModel has 3 properties (one for the TextBox and two other for the ComboBox) and the method AddNewItem without parameters.

    The method can be triggered from a command, but there is no standard class for commands, so I will call it from the code-behind:

       ((MainViewModel)this.DataContext).AddNewItem();
    

    So you must explicitly set an added item as selected after you add it to a collection.

    Because the method OnItemsChanged of the ComboBox class is protected and can't be used.