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:
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