How to combine ListBox and ComboBox?

MeisonSan 40 Reputation points
2023-04-16T08:14:59.7766667+00:00

Why is the data not updated in the ComboBox after it is changed in the ListBox? (ListBox and ComboBox` are in different files) Оn the start window there is an empty combobox,2

<ComboBox
    x:Name="cmbUser"
    ItemsSource="{Binding ElementName=usersList, Path=Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
    Margin="211,50,211,267"
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding Name}" FontSize="16" />
                <TextBlock Text="{Binding Age}" FontSize="13" />
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>
ComboBox
  public partial class MainWindow : Window
    {

        ApplicationContext db = new ApplicationContext();
        
        public MainWindow()
        {
            InitializeComponent();
            Loaded += MainWindow_Loaded;
            
                Binding binding = new Binding();
                binding.ElementName = "usersList";
                binding.Path = new PropertyPath("Text"); 
                cmbFarm.SetBinding(ComboBox.TextProperty, binding); 

        }


        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            db.Database.EnsureCreated();
            db.Users.Load();
            DataContext = db.Users.Local.ToObservableCollection();
        }
        // Open
        private void Open_Click(object sender, RoutedEventArgs e)
        {
            Open Open = new Open(new User());
            if (Open.ShowDialog() == true)
            {
                User user= (User)this.Resources["cmbFarm"];
                user.Name = user.Name; // Меняем с Google на LG

                User User = Open.User;
                db.Users.Add(User);
                db.SaveChanges();
            }
        } 

when i click on "Открыть 1", opens window with listbox, in which I can delete change add entries, and when i change the record they are not saved in the combobox. 1

 <ListBox x:Name="usersList" ItemsSource="{Binding}" ButtonBase.Click="Edit_Click" Margin="0,0,50,0" >
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding Name, Mode=TwoWay}" FontSize="16" />
                        <TextBlock Text="{Binding Age,  Mode=TwoWay}" FontSize="13" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
public partial class Open : Window
    {
        public User User { get; private set; }

        ApplicationContext db = new ApplicationContext();
        public Open(User user)
        {
            InitializeComponent();

            Loaded += Open_Loaded;
            User = user;
            DataContext = User;

        }


        private void Open_Loaded(object sender, RoutedEventArgs e)
        {

            db.Database.EnsureCreated();
            db.Users.Load();
            DataContext = db.Users.Local.ToObservableCollection();

           
               
            
        }
        // добавление
        private void Add_Click(object sender, RoutedEventArgs e)
        {

            UserWindow UserWindow = new UserWindow(new User());
            if (UserWindow.ShowDialog() == true)
            {
                User User = UserWindow.User;
                db.Users.Add(User);
                db.SaveChanges();

                
            }
        }
        // Edit
        private void Edit_Click(object sender, RoutedEventArgs e)
        {

            User? user = usersList.SelectedItem as User;
            if (user is null) return;

            UserWindow UserWindow = new UserWindow(new User
            {
                id = user.id,
                Age = user.Age,
                Name = user.Name
            });

            if (UserWindow.ShowDialog() == true)
            {
                user = db.Users.Find(UserWindow.User.id);
                if (user != null)
                {
                    user.Age = UserWindow.User.Age;
                    user.Name = UserWindow.User.Name;
                    db.SaveChanges();
   
                }
            }
        }

        // Delete
        private void Delete_Click(object sender, RoutedEventArgs e)
        {

            User? user = usersList.SelectedItem as User;
            if (user is null) return;
            db.Users.Remove(user);
            db.SaveChanges();
          
        }

    }

when I place combobox and listbox in one .cs and .xaml file the data is instantly updated after changing the lisbox

  public class User : INotifyPropertyChanged
    {
        public int id { get; set; }
        public string? name { get; set; }
        public int age { get; set; }

       
        public string Name
        {
            get { return name; }
            set
            {
                name = value;
                OnPropertyChanged("Name");
            }
        }
        public int Age
        {
            get { return age; }
            set
            {
                age = value;
                OnPropertyChanged("Age");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName] string prop = "")
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(prop));
        }
Developer technologies XAML
Developer technologies C#
0 comments No comments
{count} votes

1 answer

Sort by: Most helpful
  1. Hui Liu-MSFT 48,676 Reputation points Microsoft External Staff
    2023-04-17T07:22:47.1666667+00:00

    Hi,@Максимилиан Янулевич. For combining ListBox and ComboBox, you could refer to the following code. MainWindow.xaml:

    <Grid>
    
            <ComboBox  x:Name="cmbUser"  ItemsSource="{Binding Users ,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"
        Margin="211,50,211,267">
                <ComboBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding Name}" FontSize="16" />
                        <TextBlock Text="{Binding Age}" FontSize="13" />
                    </StackPanel>
                </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>
            <Button Content="Open" Click="Open_Click" Width="100" Height="50" Margin="650,0,0,320"/>
        </Grid>
    

    MainWindow.xaml.cs:

      public partial class MainWindow : Window, INotifyPropertyChanged
        {
            Open open;
            public MainWindow()
            {
                InitializeComponent();
                DataContext= this;
            }
            private ObservableCollection<User> users = new ObservableCollection<User>();
            public ObservableCollection<User> Users
            {
                get { return users; }
                set
                {
                    if (users != value)
                    {
                        users = value;
                        OnPropertyChanged("Users");
                    }
                }
            }
            private void Open_Click(object sender, RoutedEventArgs e)
            {
                open = new Open(new User());
                if (open.ShowDialog() == true)
                {
                    open.db.Users.Load();
                    Users = open.db.Users.Local.ToObservableCollection();
                    cmbUser.Items.Refresh();
                }
            }
    
            public event PropertyChangedEventHandler PropertyChanged;
            protected void OnPropertyChanged([CallerMemberName] string name = null)
            {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
            }
        }
        public class ApplicationContext : DbContext
        {
            public DbSet<User> Users { get; set; }
            protected override void OnConfiguring(
                DbContextOptionsBuilder optionsBuilder)
            {
                optionsBuilder.UseSqlite(
                    "Data Source=uses.db");
                optionsBuilder.UseLazyLoadingProxies();
            }
        }
    
        public class User 
        {
            private int id { get; set; }
            private string? name { get; set; }
            private int age { get; set; }
    
            public int Id
            {
                get { return id; }
                set
                {
                    id = value;
                    OnPropertyChanged("Id");
                }
            }
            public string? Name
            {
                get { return name; }
                set
                {
                    name = value;
                    OnPropertyChanged("Name");
                }
            }
            public int Age
            {
                get { return age; }
                set
                {
                    age = value;
                    OnPropertyChanged("Age");
                }
            }
    
            public event PropertyChangedEventHandler PropertyChanged;
            public void OnPropertyChanged([CallerMemberName] string prop = "")
            {
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs(prop));
            }
        }
    
    

    Open.xaml.cs:

      public partial class Open : Window
        {
            public User User { get; private set; }
    
            public ApplicationContext db { get;set; } = new ApplicationContext();
          
            public Open(User user )
            {
                InitializeComponent();
    
                Loaded += Open_Loaded ;
                User = user;
                DataContext = User;
            }
    
            private void Open_Loaded(object sender, RoutedEventArgs e)
            {
                db.Database.EnsureCreated();
                db.Users.Load();
                DataContext = db.Users.Local.ToObservableCollection();
            }
            
            private void Add_Click(object sender, RoutedEventArgs e)
            {
    
                UserWindow UserWindow = new UserWindow(new User());
                if (UserWindow.ShowDialog() == true)
                {
                    User User = UserWindow.User;
                    
                    db.Users.Add(User);
                    db.SaveChanges();
                    DialogResult = true;
                }
            }
            private void Edit_Click(object sender, RoutedEventArgs e)
            {
                User? user = usersList.SelectedItem as User;
                if (user is null) return;
    
                UserWindow UserWindow = new UserWindow(new User
                {
                    Id = user.Id,
                    Age = user.Age,
                    Name = user.Name
                });
    
                if (UserWindow.ShowDialog() == true)
                {
                    user = db.Users.Find(UserWindow.User.Id);
                    if (user != null)
                    {
                        user.Age = UserWindow.User.Age;
                        user.Name = UserWindow.User.Name;
                        db.SaveChanges();
    
                    }
                }
            }
            private void Delete_Click(object sender, RoutedEventArgs e)
            {
    
                User? user = usersList.SelectedItem as User;
                if (user is null) return;
                db.Users.Remove(user);
                db.SaveChanges();
    
            }
    
    
        }
    
    

    The result: 1


    If the response is helpful, please click "Accept Answer" and upvote it. Note: Please follow the steps in our [documentation][5] to enable e-mail notifications if you want to receive the related email notification for this thread. [5]: https://docs.microsoft.com/en-us/answers/articles/67444/email-notifications.html


Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.